如何在 JFrame 中绘制 JPanel | Java
How to paint JPanel inside JFrame | Java
我有一个包含按钮、菜单和 JPanel 的 JFrame。其中一个按钮会打开一个新的 JFrame,它需要接收一些有关创建 JPanel 的信息。单击此面板中的 "OK" 假设立即在 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 timer 来调用 repaint()
import javax.swing.Timer;
int milliseconds = 100; // between timer calls.
Timer timer = new Timer(milliseconds, (ae)->repaint());
timer.start();
如果您想在计时器内执行更多操作,请设置一个 actionListener 并将其实例用作计时器的第二个参数。
并确保您在 EDT(绘画完成的地方)之外进行大部分处理。换句话说,将计算量保持在 paintComponent
以内。
我有一个包含按钮、菜单和 JPanel 的 JFrame。其中一个按钮会打开一个新的 JFrame,它需要接收一些有关创建 JPanel 的信息。单击此面板中的 "OK" 假设立即在 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 timer 来调用 repaint()
import javax.swing.Timer;
int milliseconds = 100; // between timer calls.
Timer timer = new Timer(milliseconds, (ae)->repaint());
timer.start();
如果您想在计时器内执行更多操作,请设置一个 actionListener 并将其实例用作计时器的第二个参数。
并确保您在 EDT(绘画完成的地方)之外进行大部分处理。换句话说,将计算量保持在 paintComponent
以内。