简体   繁体   English

ActionListener中的Java Swing问题

[英]Java swing questions in 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) {


    }

}

I have two buttons on the main frame, and I hope to change the panel when I press the button. 我在主机上有两个按钮,我希望在按下按钮时更换面板。

The question is that the code in "actionPerformed" doesn't work, 问题是“ actionPerformed”中的代码不起作用,

but it works well if I put them in the creatGUI()....(see the marked section). 但是,如果我将它们放在creatGUI()中,效果很好。...(请参阅标记部分)。

Is that anything wrong ? 那有什么事吗?

After adding components on the run, to your JFrame you need to call revalidate() and repaint() for changing to be visible. 在运行中添加组件之后,需要将revalidate()repaint()调用到JFrame ,以使其可见。

Though as you said, if you are adding them inside the createGUI() , that way it is visible, since at that time it's a static addition to your Swing Application, you added that first and then set it to visible. 尽管如您所说,如果您将它们添加到createGUI() ,就可以看到它,因为那时它是对Swing应用程序的静态添加,因此您首先添加了它,然后将其设置为visible。

Though your code has a bit of loopholes, the best I can tell you real quick, is you extending JPanel for ResultPanel , though you never used ResultPanel , so I modified your code to take ResultPanel into perspective. 尽管您的代码有一些漏洞,但我可以很快告诉您的是,您扩展了JPanel for ResultPanel ,尽管您从未使用过ResultPanel ,所以我修改了代码以将ResultPanel纳入透视图。 Here try this modified code from your example : 在这里尝试从您的示例修改后的代码:

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) {


    }

}

Just call pack(); 只需调用pack(); after you add the panel. 添加面板后。 This will get the JFrame to show the update. 这将使JFrame显示更新。

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

使用ActionListener的 匿名类

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();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM