2013-01-11 3 views
2

JTextField 클래스의 setText() 메서드에 문제가 있습니다. 즉, 아래의 CounterPanel 클래스에서는 작동하지 않습니다. run() 메서드에서 호출되며 텍스트 필드를 업데이트하지 않습니다. 나머지 코드가 실행되었습니다. (왼쪽에있는 println() 문을 사용하여 콘솔에 인쇄 할 수 있습니다.JTextField setText() 메서드가 run() 메서드에서 작동하지 않습니다.

이 패널은 아래에 포함 된 MainWindow 클래스에 추가됩니다. MainWindow의 CounterPanels와 각각의 스레드는 자체 스레드를 얻습니다. 앞에서 말했듯이 run() 메서드의 나머지 코드는 정상적으로 작동하므로 어디서 잘못 될지 알 수 있습니다.

많은 감사합니다.

import java.awt.Color; 

import javax.swing.BorderFactory; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

import net.miginfocom.swing.MigLayout; 

public class CounterPanel extends JPanel implements Runnable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private JLabel labelOne = new JLabel("Counter 1"); 
    private JTextField textFieldOne = new JTextField(3); 
    private JLabel labelTwo = new JLabel("Counter 2"); 
    private JTextField textFieldTwo = new JTextField(3); 

    private int counter; 
    private String counterAsString = Integer.toString(counter); 

    public CounterPanel() { 
     this.setLayout(new MigLayout()); 
     this.setBorder(BorderFactory.createLineBorder(Color.black, 1)); 
     this.add(labelOne); 
     this.add(textFieldOne); 
     this.add(labelTwo); 
     this.add(textFieldTwo); 
    } 

    @Override 
    public void run() { 
     while(counter < 100) { 
      textFieldOne.setText(counterAsString); 
      textFieldTwo.setText(counterAsString); 
      System.out.println("Counter 1 = " + counterAsString + ", Counter 2 = " + counterAsString); 
      counter++; 
     } 
     System.out.println("FINISHED"); 
    } 

} 




import java.awt.Color; 

import javax.swing.*; 

import net.miginfocom.swing.MigLayout; 

public class MainWindow extends JFrame { 

    private CounterPanel panel1 = new CounterPanel(); 
    private CounterPanel panel2 = new CounterPanel(); 
    private CounterPanel panel3 = new CounterPanel(); 
    private CounterPanel panel4 = new CounterPanel(); 

    private JLabel labelOne = new JLabel("A"); 
    private JLabel labelTwo = new JLabel("B"); 
    private JLabel labelThree = new JLabel("C"); 
    private JLabel labelFour = new JLabel("D"); 


    public MainWindow() { 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.setLayout(new MigLayout()); 
     this.add(labelOne, "gapright 20px"); 
     this.getContentPane().add(panel1, "wrap"); 
     this.add(labelTwo); 
     this.getContentPane().add(panel2, "wrap"); 
     this.add(labelThree); 
     this.getContentPane().add(panel3, "wrap"); 
     this.add(labelFour); 
     this.getContentPane().add(panel4); 
     this.pack(); 
     this.setVisible(true); 
    } 

    public static void main(String[] args) { 
     MainWindow window = new MainWindow(); 
     window.setLocationRelativeTo(null); 
     window.runThreads(); 
    } 

    public void runThreads() { 
     Thread panelThread1 = new Thread(panel1); 
     Thread panelThread2 = new Thread(panel2); 
     Thread panelThread3 = new Thread(panel3); 
     Thread panelThread4 = new Thread(panel4); 

     panelThread1.start(); 
     panelThread2.start(); 
     panelThread3.start(); 
     panelThread4.start(); 
    } 

} 

답변

5

문제는 :

스윙 구성 요소가 있어야한다 Event Dispatch Thread에서 생성 및 조작 된 SwingUtilities.invokeXXX 블록.

이 작업을 수행하지 마십시오. A의 읽게

+1

+1을 얻는다! – TechSpellBound

+1

David에게 감사드립니다. GUI 및 스레딩을 시작하기 만하면됩니다. – user1061799

0

귀하의 문자열 counterAsString 때마다 업데이트되지 않는 INT 카운터는 지식에 대한

while(counter < 100) { 
      // put this here 
      >> counterAsString = Integer.toString(counter); 
      textFieldOne.setText(counterAsString); 
      textFieldTwo.setText(counterAsString); 
      System.out.println("Counter 1 = " + counterAsString + ", Counter 2 = " + counterAsString); 
      counter++; 
} 
+0

실제로 그렇지 않습니다! Kostronor에게 감사드립니다. – user1061799

관련 문제