2

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

检测.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);
    }
}
4

2 回答 2

3

从基础开始,在使用 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");
    }    
}
于 2013-03-28T07:54:40.880 回答
1

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

于 2013-03-28T06:54:46.923 回答