Java 从线程更新gui(另一个类)
我有一个叫做Gui的类。这是我放置所有标签和按钮的地方。 它还包含一个button.addactionlistener。 当按下按钮时,它会启动另一个线程(秒表)。 当秒表进入一个循环时,它会在一个while循环中不断更新ms、sec、min 秒表是另一个类文件。秒表包含毫秒、秒、分钟 如何使用秒表ms,sec,min更新gui标签Java 从线程更新gui(另一个类),java,multithreading,swing,java-threads,Java,Multithreading,Swing,Java Threads,我有一个叫做Gui的类。这是我放置所有标签和按钮的地方。 它还包含一个button.addactionlistener。 当按下按钮时,它会启动另一个线程(秒表)。 当秒表进入一个循环时,它会在一个while循环中不断更新ms、sec、min 秒表是另一个类文件。秒表包含毫秒、秒、分钟 如何使用秒表ms,sec,min更新gui标签 public class Gui { JFrame swFrame = new JFrame("Stopwatch"); Stopwatch sw = new S
public class Gui {
JFrame swFrame = new JFrame("Stopwatch");
Stopwatch sw = new Stopwatch();
Thread t1 = new Thread(sw);
private JPanel p;
private JButton b1;
private JButton b2;
private JButton b3;
private JLabel l1;
private JLabel l2;
public Gui()
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
swFrame.setSize(500,400);
swFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
p = new JPanel();
b1 = new JButton("StartStop");
b2 = new JButton("LapTime");
b3 = new JButton("Reset");
l1 = new JLabel("bla");
l2 = new JLabel("blala");
p.add(b1);
p.add(b2);
p.add(b3);
p.add(l1);
p.add(l2);
swFrame.add(p);
b1.setActionCommand("StartStop");
b2.setActionCommand("LapTime");
b3.setActionCommand("Reset");
b1.addActionListener(new ButtonClickListener());
b2.addActionListener(new ButtonClickListener());
b3.addActionListener(new ButtonClickListener());
}
});
}
private class ButtonClickListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String command = e.getActionCommand();
if( command.equals( "StartStop" ))
{
if(t1.isAlive())
{
t1.interrupt();
}
else
{
t1.start();
!!!//How to update the jlabel from the moment t1.starts?!!!!
}
}
else if( command.equals( "LapTime" ) )
{
l2.setText("Submit Button clicked.");
}
else if(command.equals("Reset"))
{
}
}
}
阶级秒表
public class Stopwatch implements Runnable
{
private int min;
private int sec;
private long ms;
Timer timerSW = new Timer();
JLabel l1;
public void run()
{
ms = System.currentTimeMillis();
while(!Thread.currentThread().isInterrupted())
{
int seconds = (int) (ms / 1000) % 60 ;
int minutes = (int) ((ms / (1000*60)) % 60);
}
}
我还有一个包含main方法的程序类。这将调用Gui
public class Program {
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
Gui gui = new Gui();
gui.swFrame.setVisible(true);
}
});
}
}
如何使用秒表ms,sec,min更新gui标签
public class Gui {
JFrame swFrame = new JFrame("Stopwatch");
Stopwatch sw = new Stopwatch();
Thread t1 = new Thread(sw);
private JPanel p;
private JButton b1;
private JButton b2;
private JButton b3;
private JLabel l1;
private JLabel l2;
public Gui()
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
swFrame.setSize(500,400);
swFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
p = new JPanel();
b1 = new JButton("StartStop");
b2 = new JButton("LapTime");
b3 = new JButton("Reset");
l1 = new JLabel("bla");
l2 = new JLabel("blala");
p.add(b1);
p.add(b2);
p.add(b3);
p.add(l1);
p.add(l2);
swFrame.add(p);
b1.setActionCommand("StartStop");
b2.setActionCommand("LapTime");
b3.setActionCommand("Reset");
b1.addActionListener(new ButtonClickListener());
b2.addActionListener(new ButtonClickListener());
b3.addActionListener(new ButtonClickListener());
}
});
}
private class ButtonClickListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String command = e.getActionCommand();
if( command.equals( "StartStop" ))
{
if(t1.isAlive())
{
t1.interrupt();
}
else
{
t1.start();
!!!//How to update the jlabel from the moment t1.starts?!!!!
}
}
else if( command.equals( "LapTime" ) )
{
l2.setText("Submit Button clicked.");
}
else if(command.equals("Reset"))
{
}
}
}
小心地说,Swing不是线程安全的,您不应该在事件调度线程的上下文之外修改它的状态
一种方法是使用,通过定时器触发UI可以响应的更新
一个更简单的解决方案可能是在线程上使用Swing计时器
,因为Swing计时器在EDT上下文中执行其通知
考虑查看和了解更多详细信息
如何使用秒表ms,sec,min更新gui标签
public class Gui {
JFrame swFrame = new JFrame("Stopwatch");
Stopwatch sw = new Stopwatch();
Thread t1 = new Thread(sw);
private JPanel p;
private JButton b1;
private JButton b2;
private JButton b3;
private JLabel l1;
private JLabel l2;
public Gui()
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
swFrame.setSize(500,400);
swFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
p = new JPanel();
b1 = new JButton("StartStop");
b2 = new JButton("LapTime");
b3 = new JButton("Reset");
l1 = new JLabel("bla");
l2 = new JLabel("blala");
p.add(b1);
p.add(b2);
p.add(b3);
p.add(l1);
p.add(l2);
swFrame.add(p);
b1.setActionCommand("StartStop");
b2.setActionCommand("LapTime");
b3.setActionCommand("Reset");
b1.addActionListener(new ButtonClickListener());
b2.addActionListener(new ButtonClickListener());
b3.addActionListener(new ButtonClickListener());
}
});
}
private class ButtonClickListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String command = e.getActionCommand();
if( command.equals( "StartStop" ))
{
if(t1.isAlive())
{
t1.interrupt();
}
else
{
t1.start();
!!!//How to update the jlabel from the moment t1.starts?!!!!
}
}
else if( command.equals( "LapTime" ) )
{
l2.setText("Submit Button clicked.");
}
else if(command.equals("Reset"))
{
}
}
}
小心地说,Swing不是线程安全的,您不应该在事件调度线程的上下文之外修改它的状态
一种方法是使用,通过定时器触发UI可以响应的更新
一个更简单的解决方案可能是在线程上使用Swing计时器
,因为Swing计时器在EDT上下文中执行其通知
考虑看一看,要了解更多细节对于这个练习,我必须创建一个秒表。更新时间的线程。以及使用JavaSwing组件。我已经删除了SwingUtilities.invokeLater(newrunnable())现在在Gui类中。你建议我做什么?把它放回去。我建议使用观测者模式,因此每次计时器更新时,你都会通知需要更新UI的观测者。在这个练习中,我必须创建一个秒表。一个更新时间的线程。并使用java swing组件。我已经删除了SwingUtilities.invokeLater(Gui类中的新Runnable()。您建议我做什么?放回去。我建议使用观察者模式,因此每次计时器更新时,您都会通知需要更新UI的观察者