XazGreatXia 2024-05-28 15:45 采纳率: 29%
浏览 4

Java按钮事件问题


//导入
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;
    }
}


各位博主,为什么这里面的这个按钮监听无效呢,按钮点击了后没有任何反应,而且下面这个函数不知道为什么,读取文件后是空的
  • 写回答

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的命名约定。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月28日

悬赏问题

  • ¥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软件的调试,以及如果代码的端口在浏览器中无法显示怎么处理