Java 是否可以使我的JFrame按钮不断打印输出

Java 是否可以使我的JFrame按钮不断打印输出,java,debugging,button,concurrency,jframe,Java,Debugging,Button,Concurrency,Jframe,该计划应该做什么: 有一个OK按钮:每1000ms输出用户时间 有一个关闭按钮:停止OK按钮,没有输出 有没有可能让我的按钮“Ok”的actionlistener在没有while循环的情况下继续运行?我正试图让它,让你可以点击一次,而每一个其他按钮仍然可以在我的JFrame工作 我的意思是,每当你把while循环放在动作监听器中,它就会忽略其他按钮的所有输入,除非我完全删除程序,否则我无法停止它。那么,是否可以让我的程序保持运行,就像它是一个while循环,但可以用我在程序中创建的“Close”

该计划应该做什么: 有一个OK按钮:每1000ms输出用户时间 有一个关闭按钮:停止OK按钮,没有输出

有没有可能让我的按钮“Ok”的actionlistener在没有while循环的情况下继续运行?我正试图让它,让你可以点击一次,而每一个其他按钮仍然可以在我的JFrame工作

我的意思是,每当你把while循环放在动作监听器中,它就会忽略其他按钮的所有输入,除非我完全删除程序,否则我无法停止它。那么,是否可以让我的程序保持运行,就像它是一个while循环,但可以用我在程序中创建的“Close”按钮停止

package com.mc.main;
import java.time.format.DateTimeFormatter;  
import java.time.LocalDateTime;   
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GetTime {
    private JFrame frame;
    private JLabel headerLabel;
    private JLabel statusLabel;
    private JPanel controlPanel;
    static String usersTimeNow;
    public GetTime() {
        prepareGUI();
        
    }
       private void prepareGUI(){
              frame = new JFrame("Java Swing");
              frame.setSize(500,500);
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.setLayout(new GridLayout(3, 1));
              frame.addWindowListener(new WindowAdapter() {
                 public void windowClosing(WindowEvent windowEvent){
                    System.exit(0);
                 }
              });
              headerLabel = new JLabel("", JLabel.CENTER);
              statusLabel = new JLabel("",JLabel.CENTER);
              statusLabel.setSize(350,100);
              controlPanel = new JPanel();
              controlPanel.setLayout(new FlowLayout());
              frame.add(headerLabel);
              frame.add(controlPanel);
              frame.add(statusLabel);
              frame.setVisible(true);
           }
           private void showButtonDemo(){
              boolean isStopped = false; 
              headerLabel.setText("Button Demo");
              JButton okButton = new JButton("OK");
              okButton.addActionListener(new ActionListener() {
                 public void actionPerformed(ActionEvent e) {
                    
                     getUsersTime();
                     sleepDelay();
                     
                 }
              });
              controlPanel.add(okButton);
              frame.setVisible(true);
              
              JButton closeButton = new JButton("CLOSE");
              closeButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // TODO Auto-generated method stub
                    frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
                }
              });
              controlPanel.add(closeButton);
              frame.setVisible(true);
              
           }
    public void getUsersTime() {
           DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");  
           LocalDateTime now = LocalDateTime.now();  
           System.out.println(dtf.format(now));  
           usersTimeNow = dtf.format(now);
           statusLabel.setText(usersTimeNow);

    }
    public void sleepDelay() {
        long start = System.currentTimeMillis();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        GetTime test = new GetTime();
        test.showButtonDemo();
        
        
    }
    
}

你应该试着改用定时器。导入javax.swing.Timer

Timer t = new Timer(1000, (ActionEvent e)->{
//here is where you would put what you want to happen every 1000 milliseconds


});

然后,您可以制作一个按钮,当按下该按钮时,您可以调用:

t.start();
对于关闭按钮:

t.stop();

你应该试着改用定时器。导入javax.swing.Timer

Timer t = new Timer(1000, (ActionEvent e)->{
//here is where you would put what you want to happen every 1000 milliseconds


});

然后,您可以制作一个按钮,当按下该按钮时,您可以调用:

t.start();
对于关闭按钮:

t.stop();

您的完整代码将是

package com.mc.main;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
public class GetTime {
    private JFrame frame;
    private JLabel headerLabel;
    private JLabel statusLabel;
    private JPanel controlPanel;
    static String usersTimeNow;
    public LocalDateTime now;
    public static Timer t;
    public GetTime() {
        prepareGUI();
        
    }
       private void prepareGUI(){
              frame = new JFrame("Java Swing");
         t = new Timer(1000,(ActionEvent e)-> {
             DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");  
             now = LocalDateTime.now();
             System.out.println(dtf.format(now));  
             usersTimeNow = dtf.format(now);
           
             statusLabel.setText(usersTimeNow);
                
            });
              frame.setSize(500,500);
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.setLayout(new GridLayout(3, 1));
              frame.addWindowListener(new WindowAdapter() {
                 public void windowClosing(WindowEvent windowEvent){
                    System.exit(0);
                 }
              });
              headerLabel = new JLabel("", JLabel.CENTER);
              statusLabel = new JLabel("",JLabel.CENTER);
              statusLabel.setSize(350,100);
              controlPanel = new JPanel();
              controlPanel.setLayout(new FlowLayout());
              frame.add(headerLabel);
              frame.add(controlPanel);
              frame.add(statusLabel);
              frame.setVisible(true);
           }
           private void showButtonDemo(){
              boolean isStopped = false; 
              headerLabel.setText("Button Demo");
              JButton okButton = new JButton("OK");
              okButton.addActionListener(new ActionListener() {
                 public void actionPerformed(ActionEvent e) {
                    
                     getUsersTime();
                     sleepDelay();
                     
                 }
              });
              controlPanel.add(okButton);
              frame.setVisible(true);
              
              JButton closeButton = new JButton("CLOSE");
              closeButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // TODO Auto-generated method stub
                   t.stop();
                    // frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
                }
              });
              controlPanel.add(closeButton);
              frame.setVisible(true);
              
           }
    public void getUsersTime() {
        t.start();  
        
           
    }
    public void sleepDelay() {
        long start = System.currentTimeMillis();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        GetTime test = new GetTime();
        test.showButtonDemo();
        
        
    }
    
}

您的完整代码将是

package com.mc.main;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
public class GetTime {
    private JFrame frame;
    private JLabel headerLabel;
    private JLabel statusLabel;
    private JPanel controlPanel;
    static String usersTimeNow;
    public LocalDateTime now;
    public static Timer t;
    public GetTime() {
        prepareGUI();
        
    }
       private void prepareGUI(){
              frame = new JFrame("Java Swing");
         t = new Timer(1000,(ActionEvent e)-> {
             DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");  
             now = LocalDateTime.now();
             System.out.println(dtf.format(now));  
             usersTimeNow = dtf.format(now);
           
             statusLabel.setText(usersTimeNow);
                
            });
              frame.setSize(500,500);
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.setLayout(new GridLayout(3, 1));
              frame.addWindowListener(new WindowAdapter() {
                 public void windowClosing(WindowEvent windowEvent){
                    System.exit(0);
                 }
              });
              headerLabel = new JLabel("", JLabel.CENTER);
              statusLabel = new JLabel("",JLabel.CENTER);
              statusLabel.setSize(350,100);
              controlPanel = new JPanel();
              controlPanel.setLayout(new FlowLayout());
              frame.add(headerLabel);
              frame.add(controlPanel);
              frame.add(statusLabel);
              frame.setVisible(true);
           }
           private void showButtonDemo(){
              boolean isStopped = false; 
              headerLabel.setText("Button Demo");
              JButton okButton = new JButton("OK");
              okButton.addActionListener(new ActionListener() {
                 public void actionPerformed(ActionEvent e) {
                    
                     getUsersTime();
                     sleepDelay();
                     
                 }
              });
              controlPanel.add(okButton);
              frame.setVisible(true);
              
              JButton closeButton = new JButton("CLOSE");
              closeButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // TODO Auto-generated method stub
                   t.stop();
                    // frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
                }
              });
              controlPanel.add(closeButton);
              frame.setVisible(true);
              
           }
    public void getUsersTime() {
        t.start();  
        
           
    }
    public void sleepDelay() {
        long start = System.currentTimeMillis();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        GetTime test = new GetTime();
        test.showButtonDemo();
        
        
    }
    
}

(1+)参见:了解基本计时器示例。(1+)参见:了解基本计时器示例。感谢您的帮助!(1-)不要为代码创建新答案。代码应该是您原始答案的一部分。谢谢您的帮助!(1-)不要为代码创建新答案。代码应该是原始答案的一部分。