我想要一个带有2个按钮(最终更多)的JFrame应用程序,我可以用它来切换多个重复操作,简单起见我现在只使用控制台打印,尽管它可能会调用方法而不是后来。这是JFrame的框架:
public class DayNight extends JFrame implements ActionListener{
//JFrame entities
private JPanel animationPanel;
private JButton button;
private JButton button2;
public static void main(String[] args) {
DayNight frame = new DayNight();
frame.setSize(2000, 1300);
frame.setLocation(1000,350);
frame.createGUI();
frame.setVisible(true);
frame.setTitle("Day/Night Cycle, Rogier");
}
private void createGUI() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container window = getContentPane();
window.setLayout(new FlowLayout() );
animationPanel = new JPanel();
animationPanel.setPreferredSize(new Dimension(2000, 900));
animationPanel.setBackground(Color.black);
window.add(animationPanel);
button = new JButton("choice1");
button.setFont(new Font("Arial", Font.PLAIN, 50));
window.add(button);
button.setActionCommand("choice1");
button.addActionListener(this);
button2 = new JButton("choice2");
button2.setFont(new Font("Arial", Font.PLAIN, 50));
window.add(button2);
button2.setActionCommand("choice2");
button2.addActionListener(this);
}
}
我尝试过以下方法:
public void actionPerformed(ActionEvent event) {
String command = event.getActionCommand();
while ("Stop"!=(command)){
command = event.getActionCommand();
try{
Thread.sleep(500);
if ("choice1".equals(command)){
System.out.println("choice1");
}
else if("choice2".equals(command)){
System.out.println("choice2");
}
else{
System.out.println("no choice");
}
}
catch(InterruptedException ex){
Thread.currentThread().interrupt();
}
}
}
但是在点击一个按钮后,它一直停留在那个打印件上,我甚至无法与按钮进行交互。我错过了什么或者我需要一个完全不同的结构吗?我已经检查了很多不同的程序,但是它们太复杂了我无法理解,读取并发性并没有为我清除它。
编辑:没有"停止"命令,因为我现在不需要它。
答案 0 :(得分:1)
您的代码有很多错误。
首先是错误的字符串比较(参见here)。
但是您的实际问题是:您正在睡觉事件调度程序线程(请参阅there)
因此,您对事件监听器睡眠的想法只是错误的方法。你不能这样做。你必须重新思考你的方法。
这里的真正的答案是:你缺乏基本的 Java知识。如果Swing UI编码,在进一步使自己负担过重之前,请考虑学习第一个这样的基本内容。
您的要求似乎是: 按钮被击中后 - 经过一段时间后您想在控制台上打印一些内容。你可以这样做:
public void actionPerformed(ActionEvent event) {
String command = event.getActionCommand();
command = event.getActionCommand();
Runnable printChoice = new Runnable() {
@Override
public void run() {
try{
Thread.sleep(500);
if ("choice1".equals(command)){
System.out.println("choice1");
}
else if("choice2".equals(command)){
System.out.println("choice2");
}
else{
System.out.println("no choice");
}
}
catch(InterruptedException ex){
Thread.currentThread().interrupt();
}
});
new Thread(printChoice).start();
}
以上:
我没有通过编译器运行它 - 它被称为“伪代码”,为您提供一些如何解决问题的想法。
但是进一步思考这个 - 我认为这是在错误的方向。在开发合理的UI应用程序时,您不希望任何 等待。
换句话说:你想到:
错误的做法。而是沿着这些方向工作:
示例:更改radiobuttons会导致触发事件。你不应该有一个循环定期检查这些按钮。相反,您可以定义用户必须遵循的明确的操作/事件流,以便触发某个操作。