swing스윙 시작하기

비고

Swing은 JavaFX대체되었습니다 . 오라클은 일반적으로 JavaFX로 새로운 애플리케이션을 개발할 것을 권장합니다. 여전히 : Swing은 당분간 Java에서 지원 될 것입니다. JavaFX는 Swing과도 잘 통합되어 전환 응용 프로그램을 원활하게 사용할 수 있습니다.

대부분의 Swing 구성 요소는 Event Dispatch Thread에 두는 것이 좋습니다. GUI 설정을 invokeLater 호출에 번들하는 것을 잊지 마시기 바랍니다. Java 문서에서 :

스윙 이벤트 처리 코드는 이벤트 발송 스레드라고하는 특수 스레드에서 실행됩니다. Swing 메서드를 호출하는 대부분의 코드도이 스레드에서 실행됩니다. 이것은 대부분의 Swing 객체 메소드가 "thread safe"하지 않기 때문에 필요합니다. 여러 스레드에서 호출하면 스레드 간섭이나 메모리 일관성 오류가 발생할 수 있습니다. 일부의 Swing 컴퍼넌트 메소드는, API 사양으로 「thread 세이프」라고 라벨이 붙어 있습니다. 이것들은 임의의 thread로부터 안전하게 호출 할 수가 있습니다. 다른 모든 Swing 구성 요소 메소드는 이벤트 발송 스레드에서 호출해야합니다. 이 규칙을 무시하는 프로그램은 대부분의 경우 올바르게 작동하지만 재현하기 어려운 예측할 수없는 오류가 발생할 수 있습니다.

또한 정당한 이유가없는 한 항상 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) 을 호출했는지 확인하십시오. 그렇지 않으면 JVM을 삭제하는 것을 잊어 버린 경우 메모리 누수를 처리해야 할 수도 있습니다.

버튼으로 증가시키기

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

/**
 * A very simple Swing example.
 */
public class SwingExample {
    /**
     * The number of times the user has clicked the button.
     */
    private long clickCount;
    
    /**
     * The main method: starting point of this application.
     *
     * @param arguments the unused command-line arguments.
     */
    public static void main(final String[] arguments) {
        new SwingExample().run();
    }

    /**
     * Schedule a job for the event-dispatching thread: create and show this
     * application's GUI.
     */
    private void run() {
        SwingUtilities.invokeLater(this::createAndShowGui);
    }
    
    /**
     * Create the simple GUI for this application and make it visible.
     */
    private void createAndShowGui() {
        // Create the frame and make sure the application exits when the user closes
        // the frame.
        JFrame mainFrame = new JFrame("Counter");
        mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        
        // Add a simple button and label.
        JPanel panel = new JPanel();
        JButton button = new JButton("Click me!");
        JLabel label = new JLabel("Click count: " + clickCount);
        panel.add(button);
        panel.add(label);
        mainFrame.getContentPane().add(panel);
        
        // Add an action listener to the button to increment the count displayed by
        // the label.
        button.addActionListener(actionEvent -> {
            clickCount++;
            label.setText("Click count: " + clickCount);
        });
        
        // Size the frame.
        mainFrame.setBounds(80, 60, 400, 300);
        //Center on screen
        mainFrame.setLocationRelativeTo(null);
        //Display frame
        mainFrame.setVisible(true);
    }
}

결과

"Click me!" 클릭 횟수가 1만큼 증가합니다.

러닝 프로그램

"Hello World!" 람다와 창 제목에

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Hello World!");
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.setSize(200, 100);
            frame.setVisible(true);
        });
    }
}

main 메소드 내부 :
첫 번째 줄에서 SwingUtilities.invokeLater 가 호출되고 code () -> {...} 블록이 포함 된 람다식이 전달됩니다. 그러면 EDT에서 전달 된 람다식이 실행됩니다. 이것은 메인 스레드 대신 Event Dispatch Threads의 줄임말입니다. 람다 식의 코드 블록 안에는 Swing 구성 요소가 만들어지고 업데이트되기 때문에 이것이 필요합니다.

람다 식의 코드 블록 내부 :
첫 번째 줄에는 frame 이라는 새 JFrame 인스턴스가 new JFrame("Hello World!") 사용하여 만들어집니다. 그러면 "Hello World!"라는 윈도우 인스턴스가 생성됩니다. 그것의 제목에. 그런 다음 두 번째 줄에서 frameEXIT_ON_CLOSE 로 구성됩니다. 그렇지 않으면 창이 닫히지 만 프로그램 실행은 계속 활성 상태로 유지됩니다. 세 번째 행은 setSize 메서드를 사용하여 frame 인스턴스의 너비가 200 픽셀이고 높이가 100 픽셀이되도록 구성합니다. 지금까지 실행은 전혀 표시되지 않습니다. 네 번째 행에서 setVisible(true) 을 호출 한 후에 만 frame 인스턴스가 화면에 표시되도록 구성됩니다.

"Hello World!" 호환성이있는 윈도우 제목에

java.lang.Runnable 을 사용하여 우리는 "Hello World!" 1.2 버전으로 거슬러 올라가는 버전의 Java 사용자가 사용할 수있는 예 :

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class Main {
    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){

            @Override
            public void run(){
                JFrame frame = new JFrame("Hello World!");
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame.setSize(200, 100);
                frame.setVisible(true);
            }
        });
    }
}