0

I want to open a new JFrame by clicking a button (btnAdd); I have tried to create an actionlistener but I am having no luck; the code runs but nothing happens when the button is clicked. The methods in question are the last two in the following code. Any help is much appreciated!

package AdvancedWeatherApp;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.event.ListSelectionListener;

import weatherforecast.FetchWeatherForecast;

public class MainFrame extends JFrame implements ListSelectionListener {

private boolean initialized = false;
private Actions actions = new Actions();

private javax.swing.JScrollPane jspFavouritesList = new javax.swing.JScrollPane();
private javax.swing.DefaultListModel<String> listModel = new javax.swing.DefaultListModel<String>();
private javax.swing.JList<String> favouritesList = new javax.swing.JList<String>(
        listModel);

private javax.swing.JLabel lblAcknowledgement = new javax.swing.JLabel();
private javax.swing.JLabel lblTitle = new javax.swing.JLabel();

private javax.swing.JButton btnAdd = new javax.swing.JButton();
private javax.swing.JButton btnRemove = new javax.swing.JButton();

public void initialize() {
    initializeGui();
    initializeEvents();
    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

/**
 * 
 */
private void initializeGui() {
    if (initialized)
        return;
    initialized = true;
    this.setSize(500, 400);

    Dimension windowSize = this.getSize();
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    this.setLocation(screenSize.width / 2 - windowSize.width / 2,
            screenSize.height / 2 - windowSize.height / 2);
    Container pane = this.getContentPane();
    pane.setLayout(new BorderLayout());
    setLayout(new BorderLayout());
    setTitle("Favourite Weather Locations");

    JPanel jpSouth = new JPanel();
    jpSouth.setLayout(new FlowLayout());

    JPanel jpNorth = new JPanel();
    jpNorth.setLayout(new FlowLayout());

    JPanel jpCenter = new JPanel();
    jpCenter.setLayout(new BoxLayout(jpCenter, BoxLayout.PAGE_AXIS));

    JPanel jpEast = new JPanel();
    JPanel jpWest = new JPanel();

    getContentPane().setBackground(Color.WHITE);
    jpEast.setBackground(Color.WHITE);
    jpWest.setBackground(Color.WHITE);
    jpCenter.setBackground(Color.WHITE);

    getContentPane().add(jspFavouritesList);
    jpCenter.add(jspFavouritesList);
    jspFavouritesList.setViewportView(favouritesList);
    favouritesList
            .setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
    favouritesList.addListSelectionListener(this);

    jpCenter.add(btnAdd);
    jpCenter.add(btnRemove);
    jpCenter.setAlignmentY(CENTER_ALIGNMENT);
    btnAdd.setText("Add Location");
    btnAdd.setAlignmentX(Component.CENTER_ALIGNMENT);
    btnAdd.setFont(new Font("Calibri", Font.PLAIN, 18));

    jpCenter.add(btnRemove);
    btnRemove.setText("Remove Location");
    btnRemove.setAlignmentX(Component.CENTER_ALIGNMENT);
    btnRemove.setFont(new Font("Calibri", Font.PLAIN, 18));

    getContentPane().add(jpEast, BorderLayout.EAST);
    getContentPane().add(jpWest, BorderLayout.WEST);

    getContentPane().add(jpSouth);
    jpSouth.add(lblAcknowledgement);
    add(lblAcknowledgement, BorderLayout.SOUTH);
    lblAcknowledgement.setText(FetchWeatherForecast.getAcknowledgement());
    lblAcknowledgement.setHorizontalAlignment(SwingConstants.CENTER);
    lblAcknowledgement.setFont(new Font("Tahoma", Font.ITALIC, 12));

    getContentPane().add(jpNorth);
    jpNorth.add(lblTitle);
    add(lblTitle, BorderLayout.NORTH);
    lblTitle.setText("Your Favourite Locations");
    lblTitle.setHorizontalAlignment(SwingConstants.CENTER);
    lblTitle.setFont(new Font("Calibri", Font.PLAIN, 32));
    lblTitle.setForeground(Color.DARK_GRAY);

    getContentPane().add(jpCenter);

}

private void initializeEvents() {
    // TODO: Add action listeners, etc
}

public class Actions implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
        command = command == null ? "" : command;
        // TODO: add if...if else... for action commands

    }
}

public void dispose() {
    // TODO: Save settings
    // super.dispose();
    System.exit(0);
}

public void setVisible(boolean b) {
    initialize();
    super.setVisible(b);
}

public static void main(String[] args) {

    new MainFrame().setVisible(true);
}

public void actionPerformed(ActionEvent evt){

    if (evt.getSource() == btnAdd) {
        showNewFrame();
        //OPEN THE SEARCH WINDOW    

        }

    }

private void showNewFrame() {
    JFrame frame = new JFrame("Search Window" );
    frame.setSize( 500,120 );
    frame.setLocationRelativeTo( null );
    frame.setVisible( true );   

}
}
Reimeus
  • 158,255
  • 15
  • 216
  • 276
  • 2
    Consult this classic work before proceeding. stackoverflow.com/questions/9554636/the-use-of-multiple-jframes-good-bad-practice/9554657#9554657 – Gilbert Le Blanc Mar 14 '13 at 16:24

4 Answers4

5

Although you have implemented the actionPerformed method as per the ActionListener interface, you class is not of that that type as you haven't implemented the interface. Once you implement that interface and register it with the JButton btnAdd,

btnAdd.addActionListener(this);

the method will be called.

A more compact alternative might be to use an anonymous interface:

btnAdd.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
      // handle button ActionEvent & display dialog...    
   }
});

Side notes:

  • Using more than one JFrame in an application creates a lot of overhead for managing updates that may need to exist between frames. The preferred approach is to use a modal JDialog if another window is required. This is discussed more here.
Community
  • 1
  • 1
Reimeus
  • 158,255
  • 15
  • 216
  • 276
0

Use this :

btnAdd.addActionListener(this);

@Override

public void actionPerformed(ActionEvent e)
{
    MainFrame frame = new MainFrame();
    frame.setVisible(true);
}
Deepak S. Gavkar
  • 447
  • 8
  • 21
-1

Type this inside the button

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {   
this.dispose();
ActionListener ActList = new ActionListener();
ActList.setVisible(true);

}

-1

see my last line

{ ActList.setVisible(true); }

  • 1
    While this code snippet may solve the question, [including an explanation](//meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) really helps to improve the quality of your post. Remember that you are answering the question for readers in the future, and those people might not know the reasons for your code suggestion. Please also try not to crowd your code with explanatory comments, this reduces the readability of both the code and the explanations! – kayess Dec 12 '16 at 11:19