Java SWING: добавление JTextField (никогда нигде не использованное) случайным образом делает экран белым - PullRequest
1 голос
/ 19 апреля 2011

Я занимаюсь разработкой на Ubuntu 10.04 с использованием Eclipse, и когда я добавляю 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 Ответ

3 голосов
/ 19 апреля 2011

Работает для меня, что заставляет меня думать, что это проблема EDT. Переместите ваш вызов на setVisible до конца основного метода.

По этой ссылке: http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

Этот метод является потокобезопасным, хотя большинство методов Swing - нет. Графический интерфейс приложения часто можно создать и показать в основном потоке: следующий типичный код безопасен, если не реализованы никакие компоненты (Swing или иным образом):

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 () небезопасен и должен выполняться в потоке диспетчеризации событий. Однако до тех пор, пока программа не имеет видимого графического интерфейса, крайне маловероятно, что JFrame или его содержимое получит вызов paint () до возврата f.show (). Поскольку после вызова f.show () код GUI отсутствует, вся работа с GUI перемещается из основного потока в поток диспетчеризации событий, а предыдущий код на практике является поточно-ориентированным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...