我一直在制作战舰计划,我一直试图使用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);
}
}
答案 0 :(得分:3)
作为一个非常原始的例子......
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);
}
}
}
的概念中成为农场主
答案 1 :(得分:0)
你正在混淆,
首先,首先是类和对象之间的区别。类是对象的蓝图,因此类的示例是Car
。然而,这样一个对象的蓝图对该类的特定实例的状态一无所知,假设你驱动100 km / u,那么你有{em>实例的Car
存储这是100公里/ u。蓝图是类,对象是实例。
因此,public class Car
为汽车制定了蓝图,new Car()
制作了该蓝图的特定实例,您可以在其中存储运行时信息。
现在有一种方法可以告诉Java,事情属于蓝图,静态。如果变量是静态的,则将其附加到蓝图。因此,为了跟上汽车的类比,汽车的静态变量可以是它的轴距,这是在编译时定义的东西(或者在创建时的汽车类比)。
回到你的问题,你正在混合类和对象,你想要做的是有BattleshipWindow
个实例存在。在BattleshipWindow中,可以使用new
创建一个实例,然后可以更改其属性。
不完全是您想要的答案,但我希望您现在了解类和对象之间的区别,这将有助于您解决问题。