swing チュートリアル
スイングを始める
サーチ…
備考
SwingはJavaFXに取って代わりました 。 Oracleは通常、JavaFXを使用して新しいアプリケーションを開発することを推奨しています。まだ:スウィングは近い将来Javaでサポートされる予定です。 JavaFXはSwingとの統合も容易で、アプリケーションをスムーズに移行できます。
SwingコンポーネントのほとんどをEvent Dispatch Threadに置くことを強くお勧めします。 GUI設定をinvokeLater
呼び出しにバンドルすることを忘れてしまうのは簡単です。 Javaドキュメンテーションから:
スイングイベント処理コードは、イベントディスパッチスレッドと呼ばれる特別なスレッドで実行されます。 Swingメソッドを呼び出すほとんどのコードもこのスレッドで実行されます。ほとんどのSwingオブジェクトメソッドはスレッドセーフではないため、これは必要です。複数のスレッドからそれらを呼び出すと、スレッドの干渉やメモリの一貫性のエラーが発生する可能性があります。 Swingコンポーネントのメソッドの中には、API仕様の「スレッドセーフ」というラベルが付いているものがあります。これらは任意のスレッドから安全に呼び出すことができます。他のすべてのSwingコンポーネントメソッドは、イベントディスパッチスレッドから呼び出さなければなりません。このルールを無視するプログラムは、ほとんどの場合正しく機能しますが、再現するのが困難な予測不可能なエラーが発生する可能性があります。
また、正当な理由がない限り、 常に setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
が呼び出されていることを確認してください。そうしないと、JVMを破棄するのを忘れた場合にメモリリークを処理する必要がsetDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
可能性があります。
ボタンでインクリメントする
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つ増えます:
"こんにちは世界!"ラムダのウィンドウタイトル
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 Threadの略です。ラムダ式のコードブロック内には、Swingコンポーネントが作成および更新されるため、これは必要です。
ラムダ式のコードブロックの内部:
最初の行では、 new JFrame("Hello World!")
を使用して、 frame
という新しいJFrame
インスタンスが作成されます。これにより、 "Hello World!"というウィンドウインスタンスが作成されます。そのタイトルに。その後、2行目で、 frame
はEXIT_ON_CLOSE
設定されEXIT_ON_CLOSE
。それ以外の場合、ウィンドウは閉じられますが、プログラムの実行はアクティブのままです。 3行目では、 setSize
メソッドを使用して、 frame
インスタンスの幅を200ピクセル、高さを100ピクセルに設定してframe
ます。これまで実行は何も表示されません。 4行目でsetVisible(true)
を呼び出した後でのみ、 frame
インスタンスは画面に表示されるように設定されています。
"こんにちは世界!"互換性のあるウィンドウのタイトル
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);
}
});
}
}