Swing はシングルスレッドのフレームワークです。つまり、単一のスレッドを使用して、すべてのイベントをすべての関係者にディスパッチします。
このスレッドをブロックするもの ( infinate などwhile-loop
) がある場合、スレッドは、再描画要求を含め、アプリケーションに着信する新しいイベントを処理できません。これにより、アプリケーションがハングしたように見えます (この場合、実際にはハングしています)。
詳細については、Swing での同時実行をご覧ください。
次の例では、ウィンドウの表面上でクリック/ドラッグすることができ、ドラッグ プロセスを表す四角形をレンダリングします。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class DrawRectangle {
public static void main(String[] args) {
new DrawRectangle();
}
public DrawRectangle() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private Rectangle dragRect;
public TestPane() {
MouseHandler handler = new MouseHandler();
addMouseListener(handler);
addMouseMotionListener(handler);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
if (dragRect != null) {
g2d.setColor(Color.DARK_GRAY);
g2d.draw(dragRect);
}
g2d.dispose();
}
public class MouseHandler extends MouseAdapter {
private Point clicked;
@Override
public void mousePressed(MouseEvent e) {
clicked = e.getPoint();
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
Point p = e.getPoint();
int x = Math.min(p.x, clicked.x);
int y = Math.min(p.y, clicked.y);
int width = Math.max(p.x, clicked.x) - x;
int height = Math.max(p.y, clicked.y) - y;
dragRect = new Rectangle(x, y, width, height);
repaint();
}
}
}
}