【发布时间】:2015-05-20 03:01:14
【问题描述】:
我的 Java 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 来避免多个实例,因为我还必须在其他类中创建主类的对象。
另一个名为 Code 的类
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,但它不会让我这样做。如果我在主类中创建一个附加文本区域的方法,然后从代码类调用该方法,它就可以工作。但是使用 g.codelog.append(test) 会给我一个 Java 空指针异常
所以我可以访问方法,但不能访问 Swing 组件。
你们能帮帮我吗?我不想在主类中为我要修改的每个 Swing 组件编写额外的方法。
谢谢
【问题讨论】: