ActionListener中的Java swing问题

时间:2012-05-20 07:01:33

标签: 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()中它会很好....(参见标记的部分)。

这有什么不对吗?

4 个答案:

答案 0 :(得分:2)

在运行中添加组件后,您需要致电JFramerevalidate()以更改为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) {


    }

}

答案 1 :(得分:1)

添加面板后,只需致电pack();即可。这将使JFrame显示更新。

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

答案 2 :(得分:0)

使用 ActionListener的匿名类

答案 3 :(得分:0)

Use one line of code: this.revalidate();
This will validate and repaint the frame so that it can show the JPanel.

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