2

私は2つ持っていJava(.java) filesます。一方にはJButtonandJTextFieldがあり、もう一方には がありThreadます。最初Java fileに に を追加しActionListenerJButton、ボタンが押されたときに、整数変数を継続的に変更するスレッド (作成された 2 番目の .java ファイルのオブジェクトとスレッドが開始されます) が実行されるようにしました。その整数変数 (2 番目の .java ファイル) の値をJTextField(1 番目の .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);
    }
}
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 に答える