Java 将JPanel添加到actionListener中的contentPane

Java 将JPanel添加到actionListener中的contentPane,java,swing,jpanel,actionlistener,Java,Swing,Jpanel,Actionlistener,我试图在actionListener方法中将JPanel添加到我的JFrame中,但它仅在第二次单击按钮后出现。这是我代码的一部分,其中panCours是JPanel和componesterdata目标JFrame: addCours.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { panC

我试图在actionListener方法中将JPanel添加到我的JFrame中,但它仅在第二次单击按钮后出现。这是我代码的一部分,其中
panCours
JPanel
componesterdata
目标
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);
        }
    });

我不明白为什么我一按按钮它就不出现。有关如何修复此问题的任何解释和帮助?

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


如上所述,(正如其他人所建议的),我建议以后不要使用
null
布局,这是唯一正确的。swing布局一开始有点笨拙,但从长远来看,它们会对您有很大帮助

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


如上所述,(正如其他人所建议的),我建议以后不要使用
null
布局,这是唯一正确的。swing布局一开始有点笨拙,但从长远来看,它们会对您有很大帮助

答案可在以下片段中找到: 您需要
revalidate()
内容窗格,而不是重新绘制框架。您可以像这样将任何面板添加到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);  
}

}

答案可在以下代码段中找到: 您需要
revalidate()
内容窗格,而不是重新绘制框架。您可以像这样将任何面板添加到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);  
}

}


查看在
actionPerformed
末尾对
JFrame
调用
pack
是否解决了您的问题。此调用解决了问题,但创建了另一个问题:它将我的
JFrame
的每个维度设置为0。@hugosusa-从外观上看,他使用的是空布局,所以这不会有多大帮助。尝试在JFrame或JPanel上调用repaint。确切地说,我使用的是
null
布局@RudiKershaw,它解决了问题。@sk001在这里看一下,在
actionPerformed
的末尾调用
JFrame
是否解决了问题。此调用解决了问题,但是创建了另一个:它将my
JFrame
的每个维度设置为0。@Hugosusa-从外观上看,他使用的是空布局,所以这不会有多大帮助。尝试在JFrame或JPanel上调用repaint。确切地说,我使用的是
null
布局@RudiKershaw,它解决了问题。@sk001请看这里,不要建议人们使用
null
layouts…这只是提出了错误的建议并引入了更多的问题谢谢,@RudiKershaw。现在,如果我只需要添加一个
JPanel
,那么它是正确的。但是我想根据按钮的选择在许多
JPanel
之间切换。使用此解决方案,显示的
JPanel
与单击的
JButton
对应。我该怎么做?@MadProgrammer-完全正确,我将更新我的答案以建议布局。但一般来说,一旦有人加入到一个项目中,他们就不想改变。建议使用布局管理器在将来会对他们有很大帮助,但现在对他们没有帮助。@sk001-切换之前的
JPanel
并在之后调用
repaint()
时是否记得删除它们?我担心多个小组的新答案可能超出了问题的范围。您可能需要发布一个新的帖子,其中包含更多的代码来演示这个问题。@RudiKershaw,然后我将发布一个新帖子,明确描述我的问题。请不要建议人们使用
null
layouts…这只会给出错误的建议并引入更多的问题hanks,@RudiKershaw。现在,如果我只需要添加一个
JPanel
,那么它是正确的。但是我想根据按钮的选择在许多
JPanel
之间切换。使用此解决方案,显示的
JPanel
与单击的
JButton
对应。我该怎么做?@MadProgrammer-完全正确,我将更新我的答案以建议布局。但一般来说,一旦有人加入到一个项目中,他们就不想改变。建议使用布局管理器在将来会对他们有很大帮助,但现在对他们没有帮助。@sk001-切换之前的
JPanel
并在之后调用
repaint()
时是否记得删除它们?我担心多个小组的新答案可能超出了问题的范围。您可能需要发布一篇新文章,其中包含更多代码来演示问题。@RudiKershaw,然后我将发布一篇新文章,明确描述我的问题。-为了绝对安全,可能需要重新验证和重新喷漆。但肯定不仅仅是重新验证为了绝对安全,可能需要重新验证和重新喷漆。但肯定不仅仅是重新验证。