簡體   English   中英

如何在內部繪制 JPanel JFrame | Java

[英]How to paint JPanel inside JFrame | Java

我有一個 JFrame,其中包括按鈕、菜單和 JPanel。 其中一個按鈕會打開一個新的 JFrame,它需要接收一些有關創建 JPanel 的信息。 單擊此面板中的“確定”假設立即在 JPanel 上顯示一些繪圖。 我成功地做到了這一點,但它導致了一個問題——paintComponent 在無限循環中被調用並且不起作用,除非 repaint 方法被調用到 paintComponent 方法中。 我該如何解決? 感謝幫助者。

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (createRoadSys != null) {
        if (createRoadSys.getFlag()) {
            for (Road r : createRoadSys.getD().getMap().getRoads()) {
                if (r.getEnable()) {
                    g.drawLine((int) r.getStartJunction().getX() + 4,
                               (int) r.getStartJunction().getY() - 3,
                               (int) r.getEndJunction().getX() + 4,
                               (int) r.getEndJunction().getY() - 2);
                }
            }
            for (Junction j : createRoadSys.getD().getMap().getJunctions()) {
                if (j instanceof LightedJunction) {
                    if (((LightedJunction) j).getLights().getTrafficLightsOn())
                        g.setColor(Color.GREEN);
                    else
                        g.setColor(Color.RED);
                }
                else
                    g.setColor(Color.BLACK);
                g.fillOval((int) j.getX(), (int) j.getY(), RADIUS * 2, RADIUS * 2);
            }
            driving = createRoadSys.getD();
            isMapCreated = true;
            for (int i = 0; i < driving.getVehicles().size(); i++) {
                drawRotetedVehicle(g,
                                   (int) driving.getVehicles().get(i).getLastRoad().getStartJunction().getX(),
                                   (int) driving.getVehicles().get(i).getLastRoad().getStartJunction().getY(),
                                   (int) driving.getVehicles().get(i).getLastRoad().getEndJunction().getX(),
                                   (int) driving.getVehicles().get(i).getLastRoad().getEndJunction().getY(), 10, 8);
            }
        }
    }
    repaint();
}

不要在paintComponent中調用repaint() 設置一個Swing 定時器來調用repaint()

import javax.swing.Timer;

int milliseconds = 100;  // between timer calls.
Timer timer = new Timer(milliseconds, (ae)->repaint());
timer.start();

如果您想在計時器內做更多事情,請設置一個 actionListener 並將其實例用作計時器的第二個參數。

並確保您在 EDT(繪畫完成的地方)之外進行大部分處理。 換句話說,將paintComponent中的計算保持在最低限度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM