gpt4 book ai didi

java - 我的 Java swing 按钮不起作用

转载 作者:行者123 更新时间:2023-12-01 22:32:30 24 4
gpt4 key购买 nike

我一直在制作一个战舰程序,我一直试图使用 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);
}
}

最佳答案

  • 静态不是你的 friend ,它的使用应该受到很大的限制。它不应该被用来提供对类字段的“简单”访问以进行类间通信
  • 您需要彻底改变这个概念,并可能使用某种 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 的概念内变得更加农场化

关于java - 我的 Java swing 按钮不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27436349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com