내가 읽고있어. Java에서 생각하고 저자는 기본 메서드가 스윙 메서드를 호출해서는 안된다고 강조했다.자바 스윙에서 스레드 안전 방식으로 gui 객체를 초기화하는 방법은 무엇입니까?
//: gui/SubmitSwingProgram.java
import javax.swing.*;
import java.util.concurrent.*;
public class SubmitSwingProgram extends JFrame {
JLabel label;
public SubmitSwingProgram() {
super("Hello Swing");
label = new JLabel("A Label");
add(label);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 100);
setVisible(true);
}
static SubmitSwingProgram ssp;
public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(new Runnable() {
public void run() { ssp = new SubmitSwingProgram(); }
});
TimeUnit.SECONDS.sleep(1);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ssp.label.setText("Hey! This is Different!");
}
});
}
} ///:~
는 GUI 객체가 생성하고 스레드 안전하고 invokeLater 방법을 통해 초기화 : 그 연습의 예를 들어 그는 (자신의 웹 페이지에서 사용 가능) 다음 코드 조각을 제공합니다.
//: gui/Button2.java
// Responding to button presses.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import static net.mindview.util.SwingConsole.*;
public class Button2 extends JFrame {
private JButton
b1 = new JButton("Button 1"),
b2 = new JButton("Button 2");
private JTextField txt = new JTextField(10);
class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String name = ((JButton)e.getSource()).getText();
txt.setText(name);
}
}
private ButtonListener bl = new ButtonListener();
public Button2() {
b1.addActionListener(bl);
b2.addActionListener(bl);
setLayout(new FlowLayout());
add(b1);
add(b2);
add(txt);
}
public static void main(String[] args) {
run(new Button2(), 200, 150);
}
} ///:~
SwingConsole은 다음과 같습니다 : 그러나 몇 페이지 나중에 저자는 다음과 같은 코드를 제공
//: net/mindview/util/SwingConsole.java
// Tool for running Swing demos from the
// console, both applets and JFrames.
package net.mindview.util;
import javax.swing.*;
public class SwingConsole {
public static void
run(final JFrame f, final int width, final int height) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
f.setTitle(f.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(width, height);
f.setVisible(true);
}
});
}
} ///:~
JFrame의를 구현하는 객체 생성 및 주요 방법/메인 스레드 내에서 초기화 앞의 예에 따라서 반대 .
내 질문은 다음과 같습니다. (1) 두 번째 예가 잘못 되었습니까? 아니면 첫 번째 예가 과장입니까? (2) setVisible 호출 후에 만 스윙 메서드를 호출하면 충분하며 기본 스레드 내에서 swing 메서드를 호출하는 것이 안전합니다.
그는 프레임이 포장되거나 보이게 될 때까지 (다루기 때문에), 다루는 것이 안전하다고 주장 할 수 있습니다. 이 사고의 문제점은 요청 큐를 트리거 할 이벤트 큐가 무엇인지 모르는 것입니다. EDT – MadProgrammer
컨텍스트 내에서 UI를 초기화하는 것이 더 안전합니다. 유용 할 수 있습니다. http://stackoverflow.com/questions/6393327/proper-way-to-start-java-swing-desktop-application – bancer