2011-04-19 6 views
1

Eclipse를 사용하여 우분투 10.04에서 개발 중이며 JTextField을 다음 코드에 추가하면 (아무데도 사용하지 않는 경우) 또는 보이게해라!) 창문은 그것이 예정되어있는 것처럼 보이는 이미지를 표시하는 대신 비어있게된다.자바 스윙 : 무작위로 JTextField를 추가하면 화면이 하얀색이됩니다.

누구든지이 문제의 원인을 알 수 있습니까?

import java.awt.FlowLayout; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 

public class Testi { 
public static void main(String[] args) { 
    ImageIcon icon1 = new ImageIcon("background.jpg"); 
    JFrame frame = new JFrame(); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(700,500); 

    JPanel panel = new JPanel(); 
    panel.setSize(600, 600); 
    panel.setOpaque(false); 

    frame.setLayout(new FlowLayout(FlowLayout.CENTER)); 

    JLabel label = new JLabel(); 
    label.setSize(500, 500); 
    label.setIcon(icon1); 
    label.setLayout(new FlowLayout(FlowLayout.CENTER)); 


     // FOLLOWING LINE IS THE PROBLEM: when in code, the screen goes white 
    JTextArea text1 = new JTextArea("asd"); 

    label.add(panel); 
    frame.add(label);  
} 
} 
+1

저는 Java 프레임에 대한 전문가는 아니지만 이전에는 전체 GUI가 JLabel 내부에서 표시되는 것을 본 적이 없었습니다. 그게 정상인가요? – Doug

+0

@thasc 아니, JLabel을 사용해야하지 않습니다. 가능한 한 tsiki가 문제를 예시하기 위해 그렇게했습니다. –

+2

아주 이상한 GUI가 있습니다. –

답변

3

제게는 그것이 EDT 문제라고 생각합니다. 전화를 setVisible으로 이동하면 기본 방법이 끝납니다. 이 링크에서

: 대부분의 Swing 메소드는 있지만 http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

이 방법은 스레드 안전합니다. 응용 프로그램의 GUI는 종종 건설 및 메인 스레드에 표시 할 수 있습니다 : 다음의 전형적인 코드는 한 어떤 구성 요소 (그렇지 않으면 스윙 또는) 실현되지 않았다 같은 안전 :

public class MyApplication { 
public static void main(String[] args) { 
    JFrame f = new JFrame("Labels"); 
    // Add components to 
    // the frame here... 
    f.pack(); 
    f.show(); 
    // Don't do any more GUI work here... 
    } 
} 

모든 코드 위 "메인"스레드에서 실행됩니다. f.pack() 호출은 JFrame 아래의 구성 요소를 구현합니다. 즉, 기술적으로 f.show() 호출은 안전하지 않으므로 이벤트 전달 스레드에서 실행되어야합니다. 그러나 프로그램에 아직 보이는 GUI가없는 한 f.show()가 반환되기 전에 JFrame이나 그 내용이 paint() 호출을받을 가능성은 매우 낮습니다. f.show() 호출 후에는 GUI 코드가 없으므로 모든 GUI 작업이 주 스레드에서 이벤트 디스 패칭 스레드로 이동하고 이전 코드는 실제로는 스레드로부터 안전합니다.

+0

고맙습니다. 이것이 문제였습니다. – tsiki