3

我在理解如何与另一个类的 GUI 进行通信时遇到问题。

我们有一个类,whitch 创建 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 文本。

示例图片

请帮忙。

4

2 回答 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:使用 OP 的代码:

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 的早期阶段。我建议您坚持使用命令行程序,直到您弄清楚 Java 是如何工作的,然后再继续使用 Swing。

于 2013-04-12T19:19:51.210 回答
0

我确信有一种方法可以通过使用 JSON http 请求来做到这一点。我找到了一篇包含一些想法的网络文章,尽管您需要在 GUI 中实现 http 请求并实现 JSON 服务器来提供请求响应。

于 2013-04-12T16:05:26.153 回答