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