Java 使用另一个对象(线程)的数据重新绘制JPanel
我面临一个问题,JPanel从一个对象获取数据,该对象有一个更新其状态变量的周期 场景如下:一个JFrame调用对象的一个方法,该方法创建第二个JFrame,然后更新一个状态变量。第二个JFrame访问该变量,并应显示在JPanel中,但否,GUI挂起 我将问题简化为一个具有相同行为的示例,这样就可以很容易地进行测试 谢谢你的帮助,谢谢 Starter.javaJava 使用另一个对象(线程)的数据重新绘制JPanel,java,multithreading,swing,repaint,Java,Multithreading,Swing,Repaint,我面临一个问题,JPanel从一个对象获取数据,该对象有一个更新其状态变量的周期 场景如下:一个JFrame调用对象的一个方法,该方法创建第二个JFrame,然后更新一个状态变量。第二个JFrame访问该变量,并应显示在JPanel中,但否,GUI挂起 我将问题简化为一个具有相同行为的示例,这样就可以很容易地进行测试 谢谢你的帮助,谢谢 Starter.java public class Starter extends JFrame { JButton button = new JBu
public class Starter extends JFrame {
JButton button = new JButton("Fight!");
public Starter() {
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
OneClass.getInstance().start();
}
});
add(button);
}
public static void main(String[] args) {
Starter frame = new Starter();
frame.setTitle("Test");
frame.setSize(400, 300);
frame.setVisible(true);
}
}
public class OneClass {
private OneFrame frame;
private int count;
private static OneClass instance;
private OneClass() {
}
public static OneClass getInstance() {
if (instance == null)
instance = new OneClass();
return instance;
}
public void start() {
frame = new OneFrame();
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
while (true)
{
count++;
System.out.println(count);
frame.repaint();
}
}
public int getCount() {
return count;
}
}
public class OneFrame extends JFrame {
private OnePanel panel = new OnePanel();
public OneFrame() {
setTitle("Test frame");
setContentPane(panel);
setResizable(false);
}
}
public class OnePanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Font ft = new Font("Times New Roman", Font.PLAIN, 20);
g.setFont(ft);
g.drawString("Count = " + OneClass.getInstance().getCount(), 20, 20);
}
}
OneClass.java
public class Starter extends JFrame {
JButton button = new JButton("Fight!");
public Starter() {
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
OneClass.getInstance().start();
}
});
add(button);
}
public static void main(String[] args) {
Starter frame = new Starter();
frame.setTitle("Test");
frame.setSize(400, 300);
frame.setVisible(true);
}
}
public class OneClass {
private OneFrame frame;
private int count;
private static OneClass instance;
private OneClass() {
}
public static OneClass getInstance() {
if (instance == null)
instance = new OneClass();
return instance;
}
public void start() {
frame = new OneFrame();
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
while (true)
{
count++;
System.out.println(count);
frame.repaint();
}
}
public int getCount() {
return count;
}
}
public class OneFrame extends JFrame {
private OnePanel panel = new OnePanel();
public OneFrame() {
setTitle("Test frame");
setContentPane(panel);
setResizable(false);
}
}
public class OnePanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Font ft = new Font("Times New Roman", Font.PLAIN, 20);
g.setFont(ft);
g.drawString("Count = " + OneClass.getInstance().getCount(), 20, 20);
}
}
OneFrame.java
public class Starter extends JFrame {
JButton button = new JButton("Fight!");
public Starter() {
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
OneClass.getInstance().start();
}
});
add(button);
}
public static void main(String[] args) {
Starter frame = new Starter();
frame.setTitle("Test");
frame.setSize(400, 300);
frame.setVisible(true);
}
}
public class OneClass {
private OneFrame frame;
private int count;
private static OneClass instance;
private OneClass() {
}
public static OneClass getInstance() {
if (instance == null)
instance = new OneClass();
return instance;
}
public void start() {
frame = new OneFrame();
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
while (true)
{
count++;
System.out.println(count);
frame.repaint();
}
}
public int getCount() {
return count;
}
}
public class OneFrame extends JFrame {
private OnePanel panel = new OnePanel();
public OneFrame() {
setTitle("Test frame");
setContentPane(panel);
setResizable(false);
}
}
public class OnePanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Font ft = new Font("Times New Roman", Font.PLAIN, 20);
g.setFont(ft);
g.drawString("Count = " + OneClass.getInstance().getCount(), 20, 20);
}
}
OnePanel.java
public class Starter extends JFrame {
JButton button = new JButton("Fight!");
public Starter() {
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
OneClass.getInstance().start();
}
});
add(button);
}
public static void main(String[] args) {
Starter frame = new Starter();
frame.setTitle("Test");
frame.setSize(400, 300);
frame.setVisible(true);
}
}
public class OneClass {
private OneFrame frame;
private int count;
private static OneClass instance;
private OneClass() {
}
public static OneClass getInstance() {
if (instance == null)
instance = new OneClass();
return instance;
}
public void start() {
frame = new OneFrame();
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
while (true)
{
count++;
System.out.println(count);
frame.repaint();
}
}
public int getCount() {
return count;
}
}
public class OneFrame extends JFrame {
private OnePanel panel = new OnePanel();
public OneFrame() {
setTitle("Test frame");
setContentPane(panel);
setResizable(false);
}
}
public class OnePanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Font ft = new Font("Times New Roman", Font.PLAIN, 20);
g.setFont(ft);
g.drawString("Count = " + OneClass.getInstance().getCount(), 20, 20);
}
}
试试这个:
public Starter() {
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new Thread() {
public void run() {
OneClass.getInstance().start();
}
}.start();
}
});
add(button);
}
由于循环与GUI在同一线程中运行,因此一旦到达无限循环,它将挂起
如果您在另一个线程中运行无限循环,那么GUI将不受该循环的影响
这可能不是最好的线程实现
请看并发教程:
现在,由于您使用的是类似单例的类,如果在线程之前调用getInstance,那么它可能仍然挂起。无限循环和GUI都在同一线程中运行,您必须创建另一个运行无限循环逻辑的线程。这就是它挂起来的原因。是的。。。这就是我想的,如果你有我的想法,我会试试看!我在做类似的循环。