Sök…


Anmärkningar

Swing har ersatts av JavaFX . Oracle rekommenderar generellt att utveckla nya applikationer med JavaFX. Fortfarande: Swing stöds i Java under överskådlig framtid. JavaFX integreras också bra med Swing, så att applikationer kan övergå smidigt.

Det rekommenderas starkt att ha de flesta av dina svingkomponenter i händelsedisktråden. Det är lätt att glömma att paketera din GUI-konfiguration i ett invokeLater samtal. Från Java-dokumentationen:

Swing-händelseshanteringskoden körs på en speciell tråd känd som händelseförsändningstråden. De flesta koder som åberopar Swing-metoder körs också på den här tråden. Detta är nödvändigt eftersom de flesta Swing-objektmetoder inte är "trådsäkra": att anropa dem från flera trådar riskerar trådinterferens eller minneskonsistensfel. Vissa Swing-komponentmetoder är märkta som "trådsäkra" i API-specifikationen. dessa kan säkert påkallas från valfri tråd. Alla andra Swing-komponentmetoder måste anropas från händelseförsändningstråden. Program som ignorerar denna regel kan fungera korrekt för det mesta, men är föremål för oförutsägbara fel som är svåra att reproducera.

Om du inte av goda skäl ska du alltid se till att du ringde setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) eller annars kan du behöva hantera en minnesläcka om du glömmer att förstöra JVM.

Steg med en knapp

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);
    }
}

Resultat

Som knappen märkt "Klicka mig!" trycks ned klickantalet ökar med en:

Kör program

"Hej världen!" på fönstertitel med lambda

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);
        });
    }
}

Inne i main
På den första raden SwingUtilities.invokeLater och ett lambda-uttryck med ett kodblock () -> {...} skickas till det. Detta kör det passerade lambda-uttrycket på EDT, vilket är förkortat för Event Dispatch Thread, istället för main thread. Detta är nödvändigt, eftersom det inom Swadda-uttryckets kodblock finns Swing-komponenter som kommer att skapas och uppdateras.

Inuti kodblocket för lambda-uttrycket:
På den första raden JFrame en ny JFrame instans som heter frame med new JFrame("Hello World!") . Detta skapar en fönsterinstans med "Hello World!" på dess titel. Efteråt på den andra raden är frame konfigurerad till EXIT_ON_CLOSE . Annars kommer fönstret bara att stängas, men programmets körning kommer att förbli aktivt. Den tredje raden konfigurerar frame instans att vara 200 pixlar i bredd och 100 pixlar i höjd med hjälp av setSize metoden. Fram till nu kommer inte körningen att visas alls. Endast efter kräver setVisible(true) på den fjärde linjen, frame är exempelvis konfigurerad för att visas på skärmen.

"Hej världen!" på fönstertitel med kompatibilitet

Med hjälp av java.lang.Runnable vi vår "Hello World!" exempel tillgängligt för Java-användare med versioner som går tillbaka till versionen 1.2:

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);
            }
        });
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow