【问题标题】:How to update the JTextField when the variable value is changed?变量值更改时如何更新 JTextField?
【发布时间】:2013-03-18 12:56:56
【问题描述】:

我有两个Java(.java) files。一个有JButtonJTextField,另一个有Thread。在第一个Java file 中,我在JButton 中添加了一个ActionListener,这样,当按下按钮时,一个线程(创建并启动线程中的第二个.java 文件的对象)运行,它不断修改一个整数变量.如何在JTextField(第一个 .java 文件)中显示该整数变量(第二个 .java 文件)的值?

检测.java

package sample;
public class Detection implements Runnable
{
    public String viewers;
    public int count;
    public void run() 
    {                         
        try 
        {
            while (true) 
            {
                // i have written code for displaying video.
                // and it say how many no. of people in the video 
                // the no of people is stored in a variable "count"

                viewers=""+count; //storing count as string so as to display in the JTextField
            }           
        }                
        catch (Exception e)
        {
            System.out.println("Exception: "+e);
        }
    }
}

UsrInterfac.java

//使用WindowBuilder eclipse juno构建

package sample;
import java.awt.EventQueue;    
import javax.swing.JFrame;   
import javax.swing.JButton;    
import javax.swing.JTextField;    
import java.awt.event.ActionListener;    
import java.awt.event.ActionEvent;    

public class UsrInterfac 
{    
    private JFrame frame;
    private JTextField textField;
    Detection dd = new Detection();
    Thread th = new Thread(dd);

    /**
     * Launch the application.
     */
    public static void main(String[] args) 
    {
        EventQueue.invokeLater(new Runnable() 
        {
            public void run() 
            {
                try 
                {
                    UsrInterfac window = new UsrInterfac();
                    window.frame.setVisible(true);
                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public UsrInterfac() 
    {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() 
    {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        JButton btnStartThread = new JButton("Start Thread");
        btnStartThread.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent arg0) 
            {               
                th.start();                 
            }
        });
        btnStartThread.setBounds(59, 133, 117, 23);
        frame.getContentPane().add(btnStartThread);

        textField = new JTextField();
        textField.setBounds(270, 134, 104, 20);
        frame.getContentPane().add(textField);
        textField.setColumns(10);
    }
}

【问题讨论】:

  • 很难理解你想要什么,试着用一些示例代码来解释,比如Class FrameJButtonJTextFieldClass Processor 想访问一些数据,像这样
  • 我附上了代码。我希望将 Detection.java 中的变量“viewers”的值显示在 UsrInterfac.java 的“textField”中,请告诉我如何执行此操作。此外,当我们在线程中流式传输视频时,变量“viewers”会不断变化。

标签: java multithreading swing


【解决方案1】:

理想情况下,您应该发布您的代码。无论如何,当你调用线程代码时,要么传递第一个类(对象)的实例,要么传递一个 JTextField 的实例,以便线程可以在文本字段中设置新值。

【讨论】:

    【解决方案2】:

    从基础开始,在使用 Swing 时,最好使用 LayoutManagers,与使用 Absolute Positioning 相比,它可以使您的工作更加轻松。 每当需要从另一个线程更改View 中的某些内容时,始终建议使用EventQueue.invokeLater(...)/EventQueue.invokeAndWait(...)

    这个小示例程序,也许可以帮助您了解如何实现您的愿望:-)

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class ThreadCounter
    {
        private CustomThread cThread;
        private JTextField tField;
        private JButton button;
        private int counter;
    
        public ThreadCounter()
        {
            counter = 0;
        }
    
        private void displayGUI()
        {
            JFrame frame = new JFrame("Thread Counter Example");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    
            JPanel contentPane = new JPanel();
            tField = new JTextField(10);
            tField.setText("0");
            button = new JButton("Start");
            button.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent ae)
                {
                    if (counter == 0)
                    {
                        cThread = new CustomThread(tField);
                        cThread.setFlagValue(true);
                        cThread.start();
                        counter = 1;
                        button.setText("Stop");
                    }
                    else
                    {
                        try
                        {
                            cThread.setFlagValue(false);
                            cThread.join();
                        }
                        catch(InterruptedException ie)
                        {
                            ie.printStackTrace();
                        }
                        counter = 0;
                        button.setText("Start");
                    }
                }
            });
    
            contentPane.add(tField);
            contentPane.add(button);
    
            frame.setContentPane(contentPane);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                @Override
                public void run()
                {
                    new ThreadCounter().displayGUI();
                }
            });
        }
    }
    
    class CustomThread extends Thread
    {
        private int changingVariable;
        private JTextField tField;
        private boolean flag = true;
    
        public CustomThread(JTextField tf)
        {
            changingVariable = 0;
            tField = tf;
        }   
    
        public void setFlagValue(boolean flag)
        {
            this.flag = flag;
        }
    
        @Override
        public void run()
        {
            while (flag)
            {
                EventQueue.invokeLater(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        tField.setText(
                            Integer.toString(
                                ++changingVariable));
                    }
                });
    
                try
                {
                    Thread.sleep(1000);
                }
                catch(InterruptedException ie)
                {
                    ie.printStackTrace();
                }
            }
            System.out.println("I am OUT of WHILE");
        }    
    }
    

    【讨论】:

      猜你喜欢
      • 2022-12-05
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2018-05-08
      • 2021-03-16
      • 2010-10-09
      相关资源
      最近更新 更多