1

我正在使用Eclipse IDE。我已经从一个不同的类添加了面板,扩展JPanel到了JFrame一个不同的类。

JButton在 Frame 上添加了一个“新”。我添加<JPanel instance>.setVisible(true)了该按钮的 actionListener 事件。但是当我按下“新建”按钮时,它会显示JPanel. 当我按下 'New' 时,我想添加该面板的新实例JButton

这是我的按钮的代码:

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 的类。

4

2 回答 2

2

首先,您需要LayoutManager在支持多个面板的框架上使用 a 。我建议现在研究一下FlowLayout——如果您刚开始使用 Swing,这是最容易学习的。您还需要调用frame.add(panel)以显示面板。您不需要调用setVisible(true),因为默认情况下所有JPanel实例都是可见的。

每当您添加或删除面板时,您还需要调用revalidate()and repaint()on - 这会强制布局使用在的基础列表JFrame中所做的任何更改来更新自身。JFrameComponent

于 2013-03-28T15:27:42.047 回答
1

我不知道你的完整代码,所以在这里做了一个简短的例子来澄清事情。

  • 如上述答案所述,您需要致电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();
                }
            });
        }
    }
    
于 2013-03-28T16:24:15.363 回答