在actionListener中将JPanel添加到contentPane

时间:2014-03-05 21:46:57

标签: java swing jpanel actionlistener

我正在尝试在actionListener方法中向我的JFrame添加JPanel,但它仅在第二次单击按钮后才会显示。这是我的代码的一部分,其中panCoursJPanelConstituerData是目标JFrame

addCours.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            panCours.setBounds(215, 2, 480, 400);
            panCours.setBorder(BorderFactory.createTitledBorder("Saisir les données concernant le cours"));
            ConstituerData.this.getContentPane().add(panCours);
        }
    });

我不明白为什么一旦点击按钮就不会出现。关于如何解决这个问题的任何解释和帮助?

2 个答案:

答案 0 :(得分:2)

您需要添加对repaint();(以及可能revalidate();)的调用才能立即显示JPanel。下面演示您的问题(和解决方案)的基本示例;

public class Test {

    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(null);

        JButton button = new JButton("Test");                       
        button.setBounds(20, 30, 100, 40);
        button.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                JPanel panel = new JPanel();
                panel.setBackground(Color.red);
                panel.setBounds(215, 2, 480, 480);
                frame.add(panel);
                frame.revalidate(); // Repaint here!! Removing these calls
                frame.repaint(); // demonstrates the problem you are having.

            }
        }); 

        frame.add(button);
        frame.setSize(695, 482);
        frame.setVisible(true);              

    }
}

如上所述,(正如其他人所建议的那样)我建议将来不要使用null布局。摆动布局从一开始就有点尴尬,但从长远来看它们会帮助你很多。

答案 1 :(得分:2)

答案可以在以下代码段中找到: 你需要revalidate() contentPane,而不是重绘框架。你可以像这样在contentpane中添加你想要的任何面板。如果您将contentPane声明为私有字段,则不需要进行getContentPane()调用。 contentPane是全局的,因此可以直接从类中的任何位置引用它。 如果在初始化之前引用它,可以小心NullPointerExeptions

public class testframe extends JFrame {

private JPanel contentPane;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                testframe frame = new testframe();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public testframe() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    contentPane = new JPanel();
    setContentPane(contentPane);

    JButton btnNewButton = new JButton("New button");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            JPanel a = new JPanel();
            contentPane.add(a);
            contentPane.revalidate();
        }
    });
    contentPane.add(btnNewButton);  
}

}