Вопросы по Java Swing в ActionListener

//GUI.java
public class GUI extends JFrame implements ActionListener {

    private static final long serialVersionUID = 870343916997182570L;
    private JPanel btmPanel;

    public GUI(String arg0) throws HeadlessException {
        super(arg0);
        createGUI();
    }

    private void createGUI() {
        setSize(WIDTH, HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        //ResultPanel rslt = new ResultPanel();
        //this.getContentPane().add(rslt.createPanel(), BorderLayout.CENTER);

        btmPanel = new JPanel();
        btmPanel.setBackground(Color.LIGHT_GRAY);
        btmPanel.setLayout(new FlowLayout());

        JButton blueSearch = new JButton("Search");
        blueSearch.setBackground(Color.WHITE);
        blueSearch.addActionListener(this);
        btmPanel.add(blueSearch);

        JButton blackChart = new JButton("Chart");
        blackChart.setBackground(Color.WHITE);
        blackChart.addActionListener(this);
        btmPanel.add(blackChart);

        this.getContentPane().add(btmPanel, BorderLayout.SOUTH);    
    }   

    @Override
    public void actionPerformed(ActionEvent e) {
        String buttonString = e.getActionCommand();

        if (buttonString.equals("Search")) {
            ResultPanel rslt = new ResultPanel();
            this.getContentPane().add(rslt.createPanel(), BorderLayout.CENTER);
        }
    }

}

//ResultPanel.java
public class ResultPanel extends JPanel implements ActionListener {

    private static final long serialVersionUID = -7851502165390304971L;
    private JPanel textPanel;
    private JTextArea textDisplay;

    public ResultPanel() {
        textPanel = new JPanel(); 
        textDisplay = new JTextArea("Text Area:");
    }

    public JPanel createPanel() {

        textDisplay.setEditable(true);
        textPanel.setBackground(Color.LIGHT_GRAY);
        textPanel.setLayout(new BorderLayout());
        textPanel.add(textDisplay,BorderLayout.CENTER);

        return textPanel;
    }

    @Override
    public void actionPerformed(ActionEvent e) {


    }

}

У меня две кнопки на основной раме, и я надеюсь изменить панель, когда я нажму кнопку.

Вопрос в том, что код в "actionPerformed" не работает,

но это работает хорошо, если я поместил их в creatGUI().... (см. отмеченный раздел).

Это что-то не так?


person user1371541    schedule 20.05.2012    source источник
comment
Вы проверили, что метод actionPerformed вообще вызывается? Печатать что-то в консоль из нее проще всего   -  person dann.dev    schedule 20.05.2012
comment
Используйте CardLayout, как показано здесьButtonGroup с JRadioButton экземпляры).   -  person Andrew Thompson    schedule 20.05.2012


Ответы (3)


Просто вызовите pack(); после добавления панели. Это заставит JFrame показать обновление.

    if (buttonString.equals("Search")) {
        ResultPanel rslt = new ResultPanel();
        this.getContentPane().add(rslt.createPanel(), BorderLayout.CENTER);
        pack();
    }
person n00begon    schedule 20.05.2012

После добавления компонентов в прогоне к вашему JFrame вам нужно вызвать revalidate() и repaint(), чтобы изменение стало видимым.

Хотя, как вы сказали, если вы добавляете их внутри createGUI(), таким образом, они видны, поскольку в то время это статическое дополнение к вашему приложению Swing, вы сначала добавили это, а затем установили его видимым.

Хотя в вашем коде есть несколько лазеек, лучшее, что я могу вам сказать, это то, что вы расширяете JPanel для ResultPanel, хотя вы никогда не использовали ResultPanel, поэтому я изменил ваш код, чтобы принять ResultPanel в перспективе. Вот попробуйте этот модифицированный код из вашего примера:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class AddComponentExample
{
    private JFrame frame;
    private JPanel btmPanel;
    private ResultPanel resultPanel;

    public AddComponentExample()
    {
        resultPanel = new ResultPanel();
    }

    private void display()
    {
        frame = new JFrame("Adding Component Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        btmPanel = new JPanel();
        btmPanel.setBackground(Color.LIGHT_GRAY);
        btmPanel.setLayout(new FlowLayout());

        JButton blueSearch = new JButton("Search");
        blueSearch.setBackground(Color.WHITE);
        blueSearch.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                if (!resultPanel.isShowing())
                {
                    resultPanel = resultPanel.createPanel();
                    frame.getContentPane().add(resultPanel, BorderLayout.CENTER);
                    frame.revalidate();  // For Java 7 and above.
                    // frame.getContentPane().revalidate(); // For Java 1.6 or below.
                    frame.repaint(); // required sometimes
                }
                else
                    System.out.println("Panel is already Visible");
            }
        });
        btmPanel.add(blueSearch);

        JButton blackChart = new JButton("Chart");
        blackChart.setBackground(Color.WHITE);
        //blackChart.addActionListener(this);
        btmPanel.add(blackChart);

        frame.getContentPane().add(btmPanel, BorderLayout.PAGE_END);
        frame.setSize(500, 500);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new AddComponentExample().display();
            }
        });
    }
}

class ResultPanel extends JPanel implements ActionListener {

    private static final long serialVersionUID = -7851502165390304971L;
    private JPanel textPanel;
    private JTextArea textDisplay;

    public ResultPanel() {
        textPanel = new JPanel(); 
        textDisplay = new JTextArea("Text Area:");
    }

    public ResultPanel createPanel() {

        textDisplay.setEditable(true);
        textPanel.setBackground(Color.LIGHT_GRAY);
        textPanel.setLayout(new BorderLayout());
        textPanel.add(textDisplay,BorderLayout.CENTER);
        add(textPanel);
        return this;
    }

    @Override
    public void actionPerformed(ActionEvent e) {


    }

}
person nIcE cOw    schedule 20.05.2012

Используйте анонимный класс для ActionListener.

person Ganesh Krishnamoorthy    schedule 10.07.2014