【问题标题】:How to paint JPanel inside JFrame | Java如何在 JFrame 中绘制 JPanel |爪哇
【发布时间】:2020-09-02 08:51:48
【问题描述】:

我有一个包含按钮、菜单和 JPanel 的 JFrame。其中一个按钮会打开一个新的 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();
}

【问题讨论】:

    标签: java swing user-interface paintcomponent repaint


    【解决方案1】:

    不要在paintComponent 内调用repaint()。设置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 内的计算量保持在最低限度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 2017-09-07
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      相关资源
      最近更新 更多