Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 外部类中的方法可访问,但GUI组件不可访问_Java_Swing_Class_Methods - Fatal编程技术网

Java 外部类中的方法可访问,但GUI组件不可访问

Java 外部类中的方法可访问,但GUI组件不可访问,java,swing,class,methods,Java,Swing,Class,Methods,我的JavaGUI有一个奇怪的问题 我可以从另一个类访问主类中的方法,但无法访问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)

我的JavaGUI有一个奇怪的问题

我可以从另一个类访问主类中的方法,但无法访问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();
}

}
我正在使用
静态代码c
静态绘图面板
来避免多个实例,因为我还必须在其他类中创建主类的对象

另一个名为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()
从另一个类重新绘制,它将不起作用,因为在这种情况下,我将直接从code类访问
面板

JTextArea也是如此。我试图从代码中附加
codelog
,但它不允许我这样做。如果我在主类中创建了一个附加Textarea的方法,然后从Code类中调用该方法,它就会工作。但是使用
g.codelog.append(test)
会给我一个Java空指针异常

因此,我可以访问这些方法,但无法访问Swing组件

你们能帮帮我吗。我不想在主类中为我要修改的每个Swing组件编写额外的方法


谢谢

屏幕上可见的UI与您在
code
类中创建的UI不同。如果希望
code
能够访问UI属性,则需要向其传递
GUI
的引用

话虽如此,我将被任命直接向任何类公开UI组件,而不是提供getter和setter(如果适用)来提供对所管理信息的访问。这可以防止rouge类对UI进行本应允许的更改(如删除组件)

根据您正在做的事情,一个可能是更好的选择,
code
在它可能对更改感兴趣时,由
GUI
通知。如果通过使用
接口
s来实现,这将减少类之间的耦合并使其更加灵活


注意
静态
不是提供跨对象通信的机制,如果可能的话应该避免,特别是在GUI这样的动态环境中。

我能够按照程序员的建议解决这个问题

这就是我改变的

我有三门课:

Main Class

Draw

Code
主类

public class GUI extends JFrame {

    Draw panel = new Draw(this);
    Code c = new Code(this);
    ...
    ...
}
代码类

public class Code {

    private GUI g;
    private Draw b;

public Code(GUI g){
    this.g = g;
}
    ...
    ...
}
绘画课

public class Draw extends JPanel{

    private GUI x;
    private Code c;

public Draw(GUI x){
    this.x = x;
}
    ...
    ...
}
我删除了所有静态声明。它现在正在工作。我现在可以访问主类中的Swing组件了

这是专业的方法吗?还是还有改进的余地。这是我第一次使用传递引用的方式来做这件事。直到现在,我一直使用静态对象


谢谢

您说过,我需要将GUI的引用传递给代码。我认为这正是我通过编写
g.codelog.append
所做的。我以为g.
就是这样。六羟甲基三聚氰胺六甲醚。。。