我的Java swing按钮不起作用

时间:2014-12-12 03:25:38

标签: java swing user-interface awt jbutton

我一直在制作战舰计划,我一直试图使用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(Frame class)     包裹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);
    }
}

2 个答案:

答案 0 :(得分:3)

  • 静态不是你的朋友,它的使用应该受到很大限制。它绝不应该用于为类间通信提供“简单”访问类字段
  • 你需要转变它的概念,并可能使用某种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

的概念中成为农场主

答案 1 :(得分:0)

你正在混淆,

首先,首先是类和对象之间的区别。类是对象的蓝图,因此类的示例是Car。然而,这样一个对象的蓝图对该类的特定实例的状态一无所知,假设你驱动100 km / u,那么你有{em>实例的Car存储这是100公里/ u。蓝图是类,对象是实例。

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

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

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

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