[英]Custom Drawing loop in Swing
我正在嘗試學習如何在Java中為正在進行的小組項目做自定義GUI。 我過去已經做過用戶表單類型的GUI,所以我知道我在這里做什么的要旨,但是自定義工程圖仍然讓我感到困惑。
我從網上復制了這段代碼,我一直試圖弄清楚它是如何工作的,但是我不明白為什么我不能循環繪制方法。 作為一個簡單的測試,我試圖使程序在光標上繪制一個橢圓形。 它在光標上繪制橢圓,但在運行時僅繪制一次,然后不執行任何操作。
我該如何進行循環,以便繼續繪畫? 還是我需要調用/使用方法的其他方式?
public class BombermanGUI extends JFrame {
public static final int CANVAS_WIDTH = 640;
public static final int CANVAS_HEIGHT = 480;
private DrawCanvas canvas;
public BombermanGUI() {
canvas = new DrawCanvas();
canvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));
Container cp = getContentPane();
cp.add(canvas);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.pack();
this.setTitle("......");
this.setVisible(true);
}
private class DrawCanvas extends JPanel{
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
setBackground(Color.BLACK);
int x, y;
x = MouseInfo.getPointerInfo().getLocation().x - this.getLocationOnScreen().x;
y = MouseInfo.getPointerInfo().getLocation().y - this.getLocationOnScreen().y;
g.setColor(Color.YELLOW);
g.drawOval(x, y, 10, 10);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new BombermanGUI();
}
});
}
}
繪制一系列復雜的回調和對系統內更改的響應。 首先要記住的是,您不控制繪畫過程,而是向系統提出建議,以便系統可以決定應重新繪畫的內容和時間。
有關更多詳細信息,請參閱AWT中的繪畫以及“搖擺和執行自定義繪畫 ”。
繪畫是一個破壞性的過程。 假定發生重新繪制時,您將重新繪制當前組件的整個狀態。 這意味着您將需要某種模型來維護所有需要繪制的內容...
看一下2D圖形 ,特別是看一下Shape
一節
為此, MouseInfo
是一種非常糟糕的檢測鼠標位置的方法,而應該使用MouseListener
和/或MouseMotionListener
來檢測鼠標事件。
基本上,當用戶按下鼠標按鈕時,您將記錄鼠標按下的位置。 移動鼠標時,您將計算相對於鼠標按下的移動寬度和高度,並更新“當前”形狀。 您將調用repaint
來請求更新UI並通過paintComponent
方法繪制此形狀(首先繪制所有先前的形狀)。
釋放鼠標按鈕時,您將向模型提交“當前”形狀,因此每次調用paintComponent
時都會對其進行繪制。
這是tobais_k即時消息,我正在回答關閉問題!
添加一個事件偵聽器並使其調用repaint方法,例如,用於跟蹤鼠標光標的鼠標運動偵聽器,或者讓某個線程運行您的游戲並定期觸發重新繪制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.