Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改Java线程中变量的值_Java_Multithreading - Fatal编程技术网

更改Java线程中变量的值

更改Java线程中变量的值,java,multithreading,Java,Multithreading,所以我正在学习线程,而我似乎无法让程序与线程一起工作 基本代码是: import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import java.awt.GridLayout; import java.awt.event.KeyListener; import java.awt.event.KeyEvent; import java.awt.Dimension; public class

所以我正在学习线程,而我似乎无法让程序与线程一起工作

基本代码是:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.GridLayout;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.Dimension;

public class CLASS1 extends JFrame implements KeyListener
{
public CLASS2 class2Variable1 = new CLASS2();
public CLASS2 class2Variable2 = new CLASS2();
public Thread thread1 = new Thread(class2Variable1);
public Thread thread2 = new Thread(class2Variable2);

public CLASS1()
{
    //Not Important for example
}

public static void main(String[] args)
{
    CLASS1 class1 = new CLASS1();
    class1.createAndShowGUI();
}

public void createAndShowGUI()
{
    CLASS1 frame = new CLASS1();
    frame.setPreferredSize(new Dimension(400,200));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel contentPane = new JPanel(new GridLayout());
    frame.setContentPane(contentPane);
    frame.addKeyListener(frame);
    frame.add(class2Variable1);
    frame.add(class2Variable2);
    thread1.start();
    thread2.start();
    frame.pack();
    frame.setVisible(true);
}

public void keyPressed(KeyEvent e)
{
    class2Variable1.speed = class2Variable1.speed + 10;
    class2Variable1.changeText("CHANGED VALUE TO: " + class2Variable1.speed);
    //Also Tried class2Variable1.labelText.setText("CHANGED VALUE");
    class2Variable1.revalidate();
    class2Variable1.repaint();
}

public void keyTyped(KeyEvent e)
{
}

public void keyReleased(KeyEvent e)
{
}
}

class CLASS2 extends JPanel implements Runnable
{
public int speed = 0;
public JLabel labelText = new JLabel(); //Also tried Initializing it here

public void changeText(String text)
{
    labelText.setText(text);
    labelText.repaint();
}

public void run()
{
    addStuff();
}

public CLASS2()
{
    setLayout(new GridLayout());
}

public void addStuff()
{
    labelText.setText("INITIAL VALUE");
    add(labelText);
    }
}

所有的KeyEvents都可以工作,但是如果我用messageDialog检查变量var1,它会显示初始化时的值(0),而不是线程的值(100)。即使使用setText,我也无法更改JLabel中的文本。

更改变量
var1
不会更改标签的文本。必须使用更改的值调用
varLabel.setText

还可以阅读这篇关于swing线程的文章:

解决方案应如下所示:

public void run()
{
     var1 = 100;
     SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            varLabel.setText(String.valueOf(var1));
            // varLabel.repaint(); // might be necessary?
        }
    });
}

这个对话在哪里?这对这个问题很重要。这可能只是一个竞争条件,嗯,当然你不会得到新的值,因为你设置了var1变量,没有可编辑的文本,而且在每个设置(
setText()
)之后你会调用
repaint()
method强制组件重新绘制。messageDialog是从更改var1值的方法运行的。JLabel中确实包含一些文本,我只是不认为这会对示例产生任何影响。我还尝试在每个setText()之后调用repaint()和revalidate(),包括在第一个类中,以及在第二个类中使用方法设置它并从该方法调用repaint()。我在Class1中调用messageDialog,即class2var1.var1=20“即使使用setText,我也无法更改JLabel中的文本。”我需要能够多次更改var1的值,这样就行不通了,不是吗?即,如果我调用class2var1.varLabel.setText(“文本”);然后是class2var1.varLabel.setText(“其他文本”);它不会改变,不是吗,因为它只会在线程启动时改变它,也就是说,
setText
会在您调用它时改变文本。当您不在UI线程中时,请记住如上所示将其包装在runnable中