![](/img/trans.png)
[英](IntelliJ GUI Designer) Runtime NullPointerException upon adding a component to a JPanel
[英]Adding JComponent to JPanel at runtime with IntelliJ GUI Designer
我已經在GUI設計器的JPanel中初始化了自己的JPanel,但是當單擊按鈕時,似乎仍然無法將此JTextField添加到新創建的JPanel中。 我沒有收到任何錯誤,已經嘗試過重新驗證,驗證,重新粉刷等等。 我什至根據其他用戶的建議,將布局設置為BoxLayout設置為面板上的布局,但這仍然行不通。
fieldsPanel
是使用GUI設計器創建的,但是我嘗試覆蓋它。
panel
是我自己的代碼,我想添加到fieldsPanel
。
public class Form extends JFrame {
private JPanel rootPanel;
private JPanel fieldsPanel;
private JPanel panel;
public Form() {
fieldsPanel = new JPanel();
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
setContentPane(rootPanel);
pack();
addFieldButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JTextField skuField = new JTextField();
panel.add(skuField);
fieldsPanel.add(panel);
pack();
repaint();
}
});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
首先對GUI設計人員發表評論。 GUI設計人員非常適合RAD和可以進行編碼的人員,但是對GUI開發的經驗很少,需要完成一次GUI項目。 在所有其他情況下,甚至在最后提到的情況下,學習僅使用代碼而不使用諸如NetBeans和IntelliJ中的設計器工具的GUI開發方法都是一個更好的長期策略。 主要原因是它對開發人員隱藏了一些內容-因此,當出現問題時,您看不到問題出在哪里,而眼見為調試的第一步(也是最關鍵的一步)。 這就是為什么開發人員花費數小時來實現日志文件並使用調試器逐步執行程序的原因。 話雖如此,關於這個問題:
IntelliJ使用XML為您生成Java代碼。 使用設計器工具時,XML是在幕后構建的。 當您運行程序時,會有一個方法調用
$$$setupUI$$$(MainView.java)
它創建Java代碼(在這種情況下,MainView擴展了JDialog)。 如果要手動初始化項目,則正確的方法是選中設計器工具中顯示“自定義創建”的框
選中此框后,將在您的代碼中創建一個名為createUIComponents的方法。 然后,可以使用此方法添加自定義創建代碼,例如:
private void createUIComponents() {
// TODO: place custom component creation code here
fieldsPanel = new JPanel();
panel = new JPanel();
}
因此,與設計師合作時必須記住的是,您必須遵守他們的規則。 使用提供的功能。 最后一點,當該對象進入作用域時,即會立即調用createUIComponents方法-不得早於立即。
如果您遵循此路徑,那么您的示例需要更改為:
public class Form extends JFrame {
private JPanel rootPanel;
private JPanel fieldsPanel;
private JPanel panel;
public Form() {
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
setContentPane(rootPanel);
pack();
addFieldButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JTextField skuField = new JTextField();
panel.add(skuField);
fieldsPanel.add(panel);
pack();
repaint();
}
});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void createUIComponents() {
// TODO: place custom component creation code here
fieldsPanel = new JPanel();
panel = new JPanel();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.