2013-03-28 2 views
2

У меня есть два Java(.java) files. У одного есть JButton и JTextField, а у другого есть Thread. Вначале Java file, я добавил ActionListener в JButton, так что, когда кнопка нажата, запускается поток (объект для второго .java-файла в созданном и потоке), который непрерывно изменяет целочисленную переменную. Как отобразить значение этой целочисленной переменной (2-го. Java-файла) в JTextField (1-го. Java-файла)?Как обновить JTextField при изменении значения переменной?

Detection.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 затмение Юнона

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); 
    } 
} 
+1

Это очень трудно понять, что вы хотите, попробуйте объяснить с какой-то образец код, например 'Class Frame' имеет' JButton' и 'JTextField'. 'Class Processor' хочет получить доступ к некоторым данным, что-то вроде этого – Apurv

+1

i hav приложил код. Я хочу, чтобы значение переменной «зрители» в Detection.java отображалось в «textField» в UsrInterfac.java Plz tel me, как это сделать. Кроме того, переменная «зрители» продолжает меняться при потоке видео в потоке. –

ответ

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"); 
    }  
} 
1

В идеале вы должны разместить свой код. Во всяком случае, когда вы вызываете код потока, либо передавайте экземпляр первого класса (объекта), либо экземпляр JTextField, чтобы поток мог установить новое значение в текстовое поле.

Смежные вопросы