我的Java swing按钮没有';行不通

我的Java swing按钮没有';行不通,java,swing,user-interface,awt,jbutton,Java,Swing,User Interface,Awt,Jbutton,我一直在制作一个战舰程序,我一直在尝试使用GUI,但它不想工作。从理论上讲,它的工作方式是GUI启动,它将问题输出到一个框(该框工作),然后计算机等待并不执行任何操作,直到您在回答问题后按下按钮。问题是,我的方法等待您单击按钮以获取文本字段中的数据,但它不起任何作用。我已经编写了一段类似的代码,在下面演示了我的问题 java(主类) java(框架类) 包装taest import java.awt.*; import java.awt.event.*; import javax.swing.

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

java(主类)

java(框架类) 包装taest

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);
    }
}
  • 静态不是你的朋友,它的使用应该受到很大的限制。决不能使用它为类间通信提供对类字段的“轻松”访问
  • 你需要改变这个概念,可能需要使用某种方法。在这里,你有一个类正在“观察”另一个类的变化。当发生更改时,被观察类通知观察类该更改。这将分离责任,因为观察到的类除了通知相关方发生的事情外,不应该关心其他事情
作为一个非常原始的例子

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

}
你也应该成为一名符合

  • 静态不是你的朋友,它的使用应该受到很大的限制。决不能使用它为类间通信提供对类字段的“轻松”访问
  • 你需要改变这个概念,可能需要使用某种方法。在这里,你有一个类正在“观察”另一个类的变化。当发生更改时,被观察类通知观察类该更改。这将分离责任,因为观察到的类除了通知相关方发生的事情外,不应该关心其他事情
作为一个非常原始的例子

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

}
你也应该成为一名符合

  • 静态不是你的朋友,它的使用应该受到很大的限制。决不能使用它为类间通信提供对类字段的“轻松”访问
  • 你需要改变这个概念,可能需要使用某种方法。在这里,你有一个类正在“观察”另一个类的变化。当发生更改时,被观察类通知观察类该更改。这将分离责任,因为观察到的类除了通知相关方发生的事情外,不应该关心其他事情
作为一个非常原始的例子

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

}
你也应该成为一名符合

  • 静态不是你的朋友,它的使用应该受到很大的限制。决不能使用它为类间通信提供对类字段的“轻松”访问
  • 你需要改变这个概念,可能需要使用某种方法。在这里,你有一个类正在“观察”另一个类的变化。当发生更改时,被观察类通知观察类该更改。这将分离责任,因为观察到的类除了通知相关方发生的事情外,不应该关心其他事情
作为一个非常原始的例子

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

}

你也应该成为农民,因为你把事情搞混了

首先,类和对象之间的区别。类是对象的蓝图,因此类的示例是
Car
。然而,这样一个对象的蓝图对该类特定实例的状态一无所知,让我们假设您行驶100 km/u,然后您有一个
Car
实例,该实例存储它以100 km/u的速度行驶。蓝图是类,对象是实例

因此,
public-class-Car
为汽车制作了一个蓝图,
new-Car()
为该蓝图制作了一个特定的实例,您可以在其中存储运行时信息

现在有一种方法可以告诉Java东西属于蓝图,静态的。如果一个变量是静态的,它将附加到蓝图。因此,为了跟上汽车的类比,汽车的静态变量可以是它的轴距,这是在编译时(或在创建时的汽车类比中)定义的

回到您的问题上来,您正在混合类和对象,您要做的是创建一个
BattleshipWindow
,其中存在实例。在该窗口中,可以使用
new
创建实例,然后更改其属性


可能不是您想要的答案,但我希望您现在了解类和对象之间的区别,这将有助于您解决问题。

您把事情搞混了

首先,类和对象之间的区别。类是对象的蓝图,因此类的示例是
Car
。然而,这样一个对象的蓝图对该类特定实例的状态一无所知,让我们假设您行驶100 km/u,然后您有一个
Car
实例,该实例存储它以100 km/u的速度行驶。蓝图是类,对象是实例

因此,
public-class-Car
为汽车制作了一个蓝图,
new-Car()
为该蓝图制作了一个特定的实例,您可以在其中存储运行时信息

现在有一种方法可以告诉Java东西属于蓝图,静态的。如果一个变量是静态的,它将附加到蓝图。因此,为了跟上汽车的类比,汽车的静态变量可以是它的轴距,这是在编译时(或在创建时的汽车类比中)定义的

回到您的问题上来,您正在混合类和对象,您要做的是创建一个
BattleshipWindow
,其中存在实例。在该窗口中,可以使用
new
创建实例,然后更改其属性