我一直在开发一个战舰程序,我一直在尝试使用GUI,但是它不想工作。从理论上讲,它应该工作的方式是:启动GUI,将问题输出到框(可以正常工作),然后计算机等待并什么也不执行,直到在回答问题后按下按钮。问题是,等待您单击按钮以获取文本字段中的数据的我的方法无法执行任何操作。我编写了类似的代码,在下面演示了我的问题。

Test.java(主类)

package taest;
import javax.swing.*;

public class Test {
    public static void main(String args[]){
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                @SuppressWarnings("unused")
                JFrame frame = new Frame();
            }
        });
        Frame.display.setText(getButtonClick());
        }
    public static String getButtonClick(){
        while(true){
            if (Frame.hasClicked){
                break;
            }
        }
        return Frame.text.getText();
    }
}


Frame.java(框架类)
    包装品鉴

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Frame extends JFrame{
    JFrame panel = new JFrame("Something");
    public static JTextArea text = new JTextArea();
    JButton button = new JButton("Click");
    public static JTextField display = new JTextField("NOthing");
    static boolean hasClicked = false;
    static String storage = "";

    public Frame(){
        setLayout(new BorderLayout());
        setSize(400,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                hasClicked = true;
                storage = text.getText();
            }

        });

        Container c = getContentPane();
        c.add(display, BorderLayout.CENTER);
        c.add(text, BorderLayout.PAGE_START);
        c.add(button, BorderLayout.PAGE_END);

        setVisible(true);
    }
}

最佳答案

静态不是您的朋友,应该限制使用它。绝不能使用它为类间通信提供对类字段的“轻松”访问
您需要颠覆这个概念,并可能使用某种Observer Pattern。在这里,您有一个班级正在“观察”其他班级的更改。当发生更改时,观察到的类将更改通知给观察类。这消除了责任,因为观察到的阶级除了将发生的事情通知感兴趣的各方外,不应该在乎


作为一个非常原始的例子...

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Test {

    public static void main(String args[]) {
        new Test();
    }

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                @SuppressWarnings("unused")
                JFrame frame = new Frame(new ViewController() {
                    @Override
                    public void messageChanged(View view, String msg) {
                        view.appendLog(msg);
                    }
                });
            }
        });
    }

    public interface ViewController {

        public void messageChanged(View view, String msg);

    }

    public interface View {

        public void appendLog(String log);

    }

    public class Frame extends JFrame implements View {

//      JFrame panel = new JFrame("Something");
        private JTextArea text = new JTextArea(5, 5);
        private JButton button = new JButton("Click");
        private JTextField display = new JTextField("NOthing");
        private String storage = "";

        private ViewController viewController;

        public Frame(ViewController controller) {
            this.viewController = controller;
            setLayout(new BorderLayout());
            setSize(400, 400);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    storage = text.getText();
                    viewController.messageChanged(Frame.this, storage);
                }

            });

            System.out.println("display = " + display.hashCode());
            System.out.println("text = " + text.hashCode());

            Container c = getContentPane();
            c.add(display, BorderLayout.CENTER);
            c.add(text, BorderLayout.PAGE_START);
            c.add(button, BorderLayout.PAGE_END);

            setVisible(true);
        }

        @Override
        public void appendLog(String log) {
            display.setText(log);
        }
    }

}


您还应该成为Model–view–controller概念中的农场主

10-06 10:56
查看更多