我的Java GUI有一個奇怪的問題。從外部類訪問的方法,但GUI組件不是
我可以從另一個類訪問主類中的方法,但我無法訪問Swing組件。
讓我告訴你我是如何構建整個事情
主類:
public class GUI extends JFrame {
static Code c = new Code();
static Draw panel = new Draw();
JTextArea codelog;
JLabel lblFile;
...
...
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
GUI frame = new GUI();
frame.create();
}
});
}
public void create() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(1280,720);
...
...
contentPane = new JPanel();
setContentPane(contentPane);
contentPane.setBackground(Color.DARK_GRAY);
GridBagLayout gbl_contentPane = new GridBagLayout();
setResizable(false);
...
...
panel.setBackground(Color.BLACK);
gbc_panel.fill = GridBagConstraints.BOTH;
gbc_panel.gridx = 1;
gbc_panel.gridy = 1;
contentPane.add(panel, gbc_panel);
codelog = new JTextArea();
codelog.setEditable(true);
JScrollPane scrollPane_1 = new JScrollPane(codelog);
codelog.setLineWrap(true);
scrollPane_1.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
codelog.setVisible(true);
scrollPane_1.setVisible(true);
GridBagConstraints gbc_scrollPane_1 = new GridBagConstraints();
gbc_scrollPane_1.gridheight = 2;
gbc_scrollPane_1.gridwidth = 4;
gbc_scrollPane_1.fill = GridBagConstraints.BOTH;
gbc_scrollPane_1.gridx = 8;
gbc_scrollPane_1.gridy = 1;
contentPane.add(scrollPane_1, gbc_scrollPane_1);
...
...
}
public void refresh(){
panel.repaint();
}
}
我使用static Code c
和static Draw panel
避免多個實例,因爲我也有在創建主類的對象其他類。
命名代碼
public class Code {
...
...
static GUI g = new GUI();
String test;
...
...
public void hpgl(){
g.codelog.append(test); // gives me nullPointerException !!
g.refresh // works
...
...
}
}
的問題是,我可以訪問主類(GUI)從其他類(如代碼)的方法,但我不能訪問組件(如JTextArea中的其他類)。
refresh()
主類中的方法證明了它。我可以訪問該方法,並在主類repaint()
作品。但是,如果我嘗試從另一個班級使用GUI.panel.repaint()
重新繪製它不會工作,因爲我會在這種情況下直接從代碼類訪問panel
。
這同樣適用於JTextArea。我試圖從代碼中追加codelog
,但它不會讓我這樣做。如果我在Main類中創建一個附加Textarea的Method,然後調用Code Class中的Method,它就可以工作。但使用g.codelog.append(test)
給了我一個Java空指針異常
所以我可以訪問的方法,但我不能訪問Swing組件。
你們能幫我嗎?我不想爲每個要修改的Swing組件在主類中編寫額外的方法。
謝謝
你說,我需要將GUI的參考傳遞給代碼。我認爲這正是我通過編寫'g.codelog.append'所做的。我認爲'g.'就是這個意思。嗯... – Zombievirus