스윙은 단일 스레드 프레임 워크입니다. 즉, 단일 스레드를 사용하여 이벤트를 모든 관련 당사자에게 전달합니다.
스레드가이 스레드를 차단하면 (예 : 무한대 while-loop
) 스레드는 다시 그리기 요청을 포함하여 응용 프로그램에 들어오는 새로운 이벤트를 처리 할 수 없습니다. 이것은 응용 프로그램을 매달아 놓은 것처럼 보이게 할 것입니다 (귀하의 경우 실제로 있음).
자세한 내용은 Concurrency in 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();
}
}
}
}
JFrame 자체가 나타나기를 원하십니까? 아니면 개요가 충분합니까? –
차단 된 Event Dispatching Thread의 멋진 세계에 오신 것을 환영합니다. 귀하의 코드는 귀하의 응용 프로그램이 새로운 이벤트를 처리하는 것을 막을뿐만 아니라 어떠한 업데이트/다시 그리기도 수행하지 못하도록합니다. – MadProgrammer
@MonadNewb 마우스로 모양이 변경되는 한 JFrame의 윤곽으로 충분합니다 움직입니다. – Maple