繁体   English   中英

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

[英]Methods from external class accessible but GUI Components not

我的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 cstatic Draw panel来避免多个实例,因为我还必须在其他类中创建Main类的Objects。

另一个名为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)。

Main Class中的refresh()方法证明了这一点。 我可以访问方法,并且在Main Class中, repaint()可以工作。 但是,如果我尝试使用GUI.panel.repaint()从另一个类重绘,它将无法正常工作,因为在这种情况下,我将直接从Code Class访问panel

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

所以我可以访问方法,但不能访问Swing组件。

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

谢谢

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

话虽如此,我倾向于将UI组件直接暴露给任何类,而是提供getter和setter(如果适用)以提供对所管理信息的访问。 这样可以防止胭脂类对应允许的UI进行更改(例如删除组件)

根据您的工作, 观察者模式可能是一个更好的选择, GUI在有可能对某些更改感兴趣时通过Code通知Code 如果通过使用interface s完成,这将减少类之间的耦合并使它更加灵活

当心static不是提供跨对象通信的机制,应尽可能避免使用static机制,尤其是在像GUI这样动态的机制中。

我能够按照MadProgrammer的建议解决问题。

这就是我改变的。

我有3个课程:

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;
}
    ...
    ...
}

我删除了所有的静态声明。 现在正在工作。 我现在可以访问Main Class中的Swing组件。

这是专业的方法吗? 还是还有改进的空间。 这是我第一次使用传递的引用方式来执行此操作。 到目前为止,我一直使用静态对象。

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM