Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaSwing中每次单击JFrame中的JButton时添加新的JPanel实例_Java_Swing_Jpanel - Fatal编程技术网

如何在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面板的新实例,以便我可以处理收据。它有一个垂直框布局,其中包含一些标签、文本字段和按钮。