//导入
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import javax.swing.*;
//创建主类
public class Election {
//主方法
public void main(String[] args) {
//设置编码
//创建初始变量
System.setProperty("file.encoding", "GBK");
ArrayList<String> arraylist = new ArrayList<>();
String m = ReadFile("name.txt");
arraylist.add(m);
//开始创建窗口
JFrame.setDefaultLookAndFeelDecorated(false);
JFrame k = new JFrame();
//初始化颜色
Color b = new Color(245,245,245);
Color bg = new Color(255,255,255);
k.getContentPane().setBackground(bg);
k.setLayout(null);
k.setSize(1000,800);
k.setResizable(false);
k.setTitle("Election");
k.setLocationRelativeTo(null);
k.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
k.setVisible(true);
//结果输出
JLabel Result = new JLabel();
Result.setBounds(350, 0, 400, 400);
Font c = new Font("楷体",Font.PLAIN,50);
Result.setFont(c);
Result.setVisible(true);
k.add(Result);
//创建按钮
JButton bt1 = new JButton("start");
bt1.setBounds(300,600,100,50);
bt1.setBackground(b);
bt1.setContentAreaFilled(true);
bt1.setVisible(true);
bt1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Thread thread = new Thread(
new Runnable() {
@Override
public void run() {
int nlength = arraylist.size();
Random r = new Random();
int a = r.nextInt(nlength);
String t = arraylist.get(a);
Result.setText(t);
}
}
);
if("start".equals(e.getActionCommand())) {
thread.run();
}
else if("stop".equals(e.getActionCommand())) {
thread.interrupted();
}
}
});
k.add(bt1);
JButton bt2 = new JButton("stop");
bt2.setBounds(600,600,100,50);
bt2.setBackground(b);
bt2.setContentAreaFilled(true);
bt2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Thread thread = new Thread(
new Runnable() {
public void run() {
int nlength = arraylist.size();
Random r = new Random();
int a = r.nextInt(nlength);
String t = arraylist.get(a);
Result.setText(t);
System.out.println(t);
}
}
);
if("start".equals(e.getActionCommand())) {
thread.run();
}
else if("stop".equals(e.getActionCommand())) {
thread.interrupted();
}
}
});
bt2.setVisible(true);
k.add(bt2);
}
//创建读取文件方法
public String ReadFile(String i) {
String s = null;
try {
FileInputStream f = new FileInputStream(i);
BufferedReader Bf;
try (InputStreamReader n = new InputStreamReader(f,"GBK")) {
Bf = new BufferedReader(n);
while((s = Bf.readLine()) != null) {
s = Bf.readLine();
}
Bf.close();
f.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return s;
}
}
各位博主,为什么这里面的这个按钮监听无效呢,按钮点击了后没有任何反应,而且下面这个函数不知道为什么,读取文件后是空的
Java按钮事件问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 阿里嘎多学长 2024-05-28 15:45关注
以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
从您提供的代码中,我注意到了几个可能的问题点,我将逐一解释并提供解决方案:
1. 按钮事件监听无效的问题
在Java Swing中,事件监听器需要正确地添加到组件上,并且事件处理逻辑需要正确实现。在您的代码中,存在几个问题:
addActionListener
方法的实现中,您创建了一个新的Thread
对象,但是没有启动这个线程。您应该调用thread.start()
来启动线程。- 在
actionPerformed
方法中,您使用了thread.interrupted()
,这是不正确的。thread.interrupted()
是一个静态方法,它用于检查当前线程是否已经被中断,而不是中断传入的线程对象。如果您想中断线程,应该调用thread.interrupt()
。 - 您的
actionPerformed
方法中,对于 "stop" 事件的处理逻辑似乎并不完整,因为您没有提供停止线程的具体实现。
2. 文件读取函数返回空值的问题
在您的
ReadFile
方法中,存在几个问题:- 您在读取文件时使用了
while
循环,但是立即用s = Bf.readLine()
覆盖了刚刚读取的行,这将导致您只读取最后一行或为空。 - 您应该在读取到一行后立即跳出循环,而不是继续读取。
解决方案
以下是针对上述问题的解决方案:
按钮事件监听
// ... bt1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if("start".equals(e.getActionCommand())) { Thread thread = new Thread( new Runnable() { @Override public void run() { // ... 你的随机选择逻辑 ... } } ); thread.start(); // 启动线程 } } }); bt2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if("stop".equals(e.getActionCommand())) { // 假设 thread 是您要停止的线程 thread.interrupt(); // 发送中断信号 } } }); // ...
文件读取函数
public String ReadFile(String i) { StringBuilder content = new StringBuilder(); try { FileInputStream f = new FileInputStream(i); BufferedReader Bf = new BufferedReader(new InputStreamReader(f, "GBK")); String line; while((line = Bf.readLine()) != null) { content.append(line).append(System.lineSeparator()); } Bf.close(); f.close(); } catch (IOException e) { e.printStackTrace(); } return content.toString().trim(); // 返回读取的内容,去除末尾的换行符 }
参考资料
- Java Swing 教程:https://docs.oracle.com/javase/tutorial/uiswing/index.html
- Java 线程中断:https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#interrupt--
请注意,您的
main
方法需要使用public static void main(String[] args)
签名,并且main
方法应该是static
的。此外,您的类名Election
应该以大写字母开头,这是Java的命名约定。解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥20 双硬盘安装Ubuntu后windows 无法挂载硬盘
- ¥15 下面求极限的步骤哪里不对,正确答案是a1a2…an
- ¥15 帮我利用jupyter 运行一个正确的代码
- ¥15 如何使用Gephi软件和Python包中的GephiStreamer交互
- ¥15 sqlite加密问题咨询
- ¥15 appdesigner接收不到udp组播的数据
- ¥15 verilog 非阻塞赋值下的移位拼接错误
- ¥100 两个按钮控制一个LED
- ¥15 用C语言写离散数学相关问题
- ¥30 如何用python的GephiStreamer连接到gephi中,把Python和Gephi的具体操作过程都展示,重点回答Gephi软件的调试,以及如果代码的端口在浏览器中无法显示怎么处理