如何在JFrame中绘制JPanel | Java

问题描述 投票:0回答:1

我有一个JFrame,其中包含按钮,菜单和JPanel。按钮之一打开一个新的JFrame,它需要接收有关创建JPanel的一些信息。单击此面板中的“确定”,以立即在JPanel上显示一些图形。我成功地做到了这一点,但它引起了一个问题-在无穷循环中调用paintComponent,除非在paintComponent方法中调用了repaint方法,否则该方法不起作用。我该如何解决?感谢您的帮助。

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();
}
java swing user-interface paintcomponent repaint
1个回答
1
投票

请勿在repaint()中呼叫paintComponent。设置Swing timer以调用repaint()

import javax.swing.Timer;

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

如果要在计时器中执行更多操作,请设置一个ActionListener并将其实例用作计时器的第二个参数。

并确保您在EDT(完成绘制)之外进行大多数处理。换句话说,将paintComponent内的计算保持为最小。

© www.soinside.com 2019 - 2024. All rights reserved.