Java 将JPanel添加到actionListener中的contentPane
我试图在actionListener方法中将JPanel添加到我的JFrame中,但它仅在第二次单击按钮后出现。这是我代码的一部分,其中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
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
是否解决了问题。此调用解决了问题,但是创建了另一个:它将myJFrame
的每个维度设置为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,然后我将发布一篇新文章,明确描述我的问题。-为了绝对安全,可能需要重新验证和重新喷漆。但肯定不仅仅是重新验证为了绝对安全,可能需要重新验证和重新喷漆。但肯定不仅仅是重新验证。