我正在尝试在actionListener方法中向我的JFrame添加JPanel,但它仅在第二次单击按钮后才会显示。这是我的代码的一部分,其中panCours
是JPanel
而ConstituerData
是目标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);
}
});
我不明白为什么一旦点击按钮就不会出现。关于如何解决这个问题的任何解释和帮助?
答案 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);
}
}