如何从另一个类与GUI进行通信?

3

我有困难理解如何从另一个类与GUI进行通信。

我们有一个类,它创建了一个Frame:

public class TestFrame extends javax.swing.JFrame {

    javax.swing.JLabel label;

    public TestFrame() {
        initComponents();
        label=sampleLabel;
    }

    private void initComponents() {

        sampleLabel = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        sampleLabel.setText("anotherText");
        getContentPane().add(sampleLabel, new org.netbeans.lib.awtextra.AbsoluteConstraints(50, 60, -1, -1));

        pack();
    }

    private javax.swing.JLabel sampleLabel;

}

Main class instantiate CreateFrame and tryes to overwrite label text:

public class Main {

    public static void main(String[] args) {

        TestFrame frame = new TestFrame();

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                frame.setVisible(true);
            }
        });
        frame.label.setText("anotherText");
    }
}

当然,上面的代码是不起作用的。但我是Java的新手,我需要以某种方式从另一个类中访问标签(如示例中所示...)

最新编辑:上面的代码确实可以工作 :) 希望有所帮助...

以下图片显示的是相同的框架。唯一改变的是JLabel文本。

示例图片

请帮忙。


你想要实现什么?只是创建一个能够生成JFrames的类和另一个实例化它的类吗?你创建JFrames的类必须有一个构造函数,用于接收标签字符串,每次实例化时可以给它不同的标签。 - Nico
我也很好奇有经验的人会如何回答这个问题。 - djangofan
http://www.quickmeme.com/meme/3tvfu8/ - leppie
我只想在一个类中建立一个简单的框架,其中包含一个标签,并以某种方式从不同的类(可能位于不同的包中...)访问和更改此标签的文本。 - BigT
2个回答

2
如果你只想通过访问其setText()方法来更改标签。你只需要按照以下步骤操作(保持其他所有内容不变):
public void makeFrames() {
        CreateFrame frame = new CreateFrame("Label1");
        frame.label.setText("new Label");
}

以下是一个快速的技巧,可以看到标签更改的效果:
public class Main {

    JButton button;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Main object = new Main();
                object.makeFrames();
            }
        });
    }

    public void makeFrames() {
        final CreateFrame frame = new CreateFrame("Label1");

        button = new JButton("Click");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.label.setText("new Label");
            }
        });
        frame.frame.add(BorderLayout.NORTH, button);
    }
}

当你点击按钮时,标签会改变为新的标签。
编辑2:(对main()进行更改,将按钮声明为静态变量,以便从main()中访问)
public class Main {

    static JButton button;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final CreateFrame frameFromMain = new CreateFrame("Label1");

                button = new JButton("Click");
                button.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        frameFromMain.label.setText("new Label");
                    }
                });
                frameFromMain.frame.add(BorderLayout.NORTH, button);
            }
        });
    }
}

请记住,您可以像访问类的其他成员一样访问CreateFrame类中的标签。如果您声明变量为静态变量,则可以直接访问它们,如下所示:

public class CreateFrame {
    JFrame frame;
    static JLabel label;
    // the rest of the class remains the same
}

public class Main {

    static JButton button;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                CreateFrame frameFromMain = new CreateFrame("Label1");

                button = new JButton("Click");
                button.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        CreateFrame.label.setText("new Label");
                    }
                });
                frameFromMain.frame.add(BorderLayout.NORTH, button);
            }
        });
    }
}

编辑3:

如果你不想要按钮,删除按钮的代码并进行以下操作:

public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                CreateFrame frameFromMain = new CreateFrame("Label1");
                CreateFrame.label.setText("new Label"); // accessing label directly from main()

            }
        });
    }

编辑4:使用原帖作者的代码:

public class TestFrame extends javax.swing.JFrame {

    javax.swing.JLabel label;

    public TestFrame() {
        initComponents();
        label=sampleLabel;
    }

    private void initComponents() {

        sampleLabel = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        sampleLabel.setText("anotherText");
        add(sampleLabel);
        pack();
    }

    private javax.swing.JLabel sampleLabel;
}

然后你的 main() 函数将如下所示:

public class Main {
    public static void main(String[] args) {

       final TestFrame frame = new TestFrame();

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                frame.setVisible(true);
            }
        });
        frame.label.setText("Text From Main");
    }
}

我进行了最小的更改。这段代码可以完美运行并实现你的要求。我去掉了你的“getContentPane”,因为在Java 6、7中不需要它。我还去掉了你的布局设置,因为我自己对它们不熟悉。你需要学会导入Java类。

看起来你正在学习Java的早期阶段。我建议你在移动到Swing之前坚持使用命令行程序,直到你弄清楚Java的工作原理。


@BigT,请查看我的回答中“EDIT:”下面的文本,让我知道那是否是你想要的。 - Nico
在你的例子中,有没有办法从main()函数内部访问'label'?这就是我所想的。非常感谢。非常感谢您的回答。 - BigT
嗨,我完全重建了我的“介绍”。我相信现在它更加清晰明了。感谢您的时间……对于误解我很抱歉。 - BigT
这是我花了10个小时解决一个简单问题的结果。一直以来,解决方案就在我的眼前,但我却看不到它 :) 非常感谢Nickecarlo花费的时间、回答和一切。矛盾的是,我已经用Java编写了大约4000行我的项目代码(演讲者身份验证系统),但那个简单的问题却花了我一整天的时间,直到现在。我会尝试点赞(这是我的第一个问题,所以我相信我会找到正确的按钮:))。向阿根廷问候:) - BigT
抱歉,我没有足够的声望...但是我保证,当我获得15点声望时,我会为您的建议点赞...再次感谢您。 - BigT
显示剩余7条评论

0

我相信可以通过使用JSON http请求来实现。我找到了一篇网络文章,其中提供了一些初始想法,尽管您需要在GUI中实现http请求,并实现JSON服务器以提供请求响应。


嗨,谢谢你的回答,但这不是我想要的。也许我表达得不太清楚。我只想在一个类中构建一个带有一个标签的简单框架,并从不同的类(可能位于不同的包中)访问和更改此标签的文本。 - BigT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接