//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()中它会很好....(参见标记的部分)。
这有什么不对吗?
答案 0 :(得分:2)
在运行中添加组件后,您需要致电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) {
}
}
答案 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();
}