如何在JavaSwing中每次单击JFrame中的JButton时添加新的JPanel实例
我在和一家公司合作。我已经将面板从一个不同的类扩展到另一个类的如何在JavaSwing中每次单击JFrame中的JButton时添加新的JPanel实例,java,swing,jpanel,Java,Swing,Jpanel,我在和一家公司合作。我已经将面板从一个不同的类扩展到另一个类的JFrame 我在框架上添加了一个“新”JButton。我在该按钮的actionListener事件上添加了.setVisible(true)。但当我按下“New”(新建)按钮时,它会显示JPanel的上一个实例。我想在按下“新建”按钮时添加该面板的新实例 以下是我的按钮的代码: final Rec r = new Rec(); JButton btnNew = new JButton("New Receipt"); btnNew.a
JFrame
我在框架上添加了一个“新”JButton
。我在该按钮的actionListener事件上添加了.setVisible(true)
。但当我按下“New”(新建)按钮时,它会显示JPanel
的上一个实例。我想在按下“新建”按钮时添加该面板的新实例
以下是我的按钮的代码:
final Rec r = new Rec();
JButton btnNew = new JButton("New Receipt");
btnNew.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
r.setVisible(true);
contentPane.add(r,BorderLayout.CENTER);
}
});
这里,Rec是一个扩展JPanel的类。首先,您需要在支持多个面板的框架上使用
布局管理器。我建议现在就研究一下FlowLayout
——如果你刚开始使用Swing,这是最简单的学习方法。您还需要调用frame.add(panel)
来显示面板。您不需要调用setVisible(true)
,因为默认情况下所有JPanel
实例都是可见的
无论何时添加或删除面板,您都需要在JFrame
上调用revalidate()
和repaint()
,这会强制布局使用在JFrame
的基础组件列表中所做的任何更改来更新自身。我不知道您的完整代码,所以我在这里做了一个简短的演讲来澄清问题
- 如上所述,您需要调用
revalidate()
和repaint()
- 根据您的
LayoutManager
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.SwingUtilities;
/**
* @author rohan
*/
public class TestPanel {
private JFrame frame;
private JPanel panel;
private JTextArea jTextArea;
private JButton butt;
TestPanel() {
createGUI();
process1();
}
private void process1() {
jTextArea.setText("hii");
frame.setVisible(true);
}
private void createGUI() {
butt = new JButton("button");
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new JPanel();
jTextArea = new JTextArea(20, 20);
panel.add(jTextArea);
panel.add(butt);
butt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
final JPanel pan = new JPanel();
JButton but = new JButton("CHANGED");
pan.add(but);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
frame.add(pan);
butt.setVisible(false);
jTextArea.setVisible(false);
pan.revalidate();
pan.repaint();
}
});
}
});
frame.add(panel);
frame.pack();
frame.setVisible(false);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestPanel();
}
});
}
}
请显示您的代码“我已将面板从一个不同的类扩展到不同类的JFrame”您应该有很好的理由这样做。您还可以告诉我们Rec r=new Rec()
包含什么?您想做什么?是的,我正在开发一个计费软件,全屏工作。我想添加一个具有收据格式完整结构的面板。因此,每当我单击“新建收据”按钮时,它都应该创建一个Rec面板的新实例,以便我可以处理收据。它有一个垂直框布局,其中包含一些标签、文本字段和按钮。