我的Java swing按钮没有';行不通
我一直在制作一个战舰程序,我一直在尝试使用GUI,但它不想工作。从理论上讲,它的工作方式是GUI启动,它将问题输出到一个框(该框工作),然后计算机等待并不执行任何操作,直到您在回答问题后按下按钮。问题是,我的方法等待您单击按钮以获取文本字段中的数据,但它不起任何作用。我已经编写了一段类似的代码,在下面演示了我的问题 java(主类) java(框架类) 包装taest我的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.
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
创建实例,然后更改其属性