gpt4 book ai didi

java - 单击按钮后 Swing 自动重新绘制 JPanel

转载 作者:行者123 更新时间:2023-12-01 12:17:36 30 4
gpt4 key购买 nike

我在使用 Swing 时遇到了这个奇怪的问题。我直接在 JPanel 上在它们之间绘制一些点和线。我只是打电话:

g.drawLine(pointAX, pointAY, pointBX, pointBY);

其中 g 是从 panel.getGraphics() 获取的 Graphics 对象

这工作正常,给了我很好的输出。但后来我尝试移动它,并在按钮上使用 ActionListener ,这会:

    panel.revalidate();
panel.repaint();
drawPanel();
moveVector(moveX, moveY);

drawPoints();
drawConnections(connections);

其他方法:drawPanel 只是绘制一些线条,因此更容易查看:

private void drawPanel(){
Graphics g = panel.getGraphics();
zeroX = panel.getWidth() / 2;
zeroY = panel.getHeight() / 2;

g.setColor(Color.GRAY);

for(int i = zeroX + 10; i < panel.getWidth(); i += 10){
g.drawLine(i, 0, i, panel.getHeight());
}

for(int i = zeroX + 10; i > 0; i -= 10){
g.drawLine(i, 0, i, panel.getHeight());
}

for(int j = zeroY - 10; j < panel.getHeight(); j += 10){
g.drawLine(0, j, panel.getWidth(), j);
}

for(int j = zeroY - 10; j > 0; j -= 10){
g.drawLine(0, j, panel.getWidth(), j);
}

g.setColor(Color.BLACK);
g.drawLine(zeroX, 0, zeroX, panel.getHeight());
g.drawLine(0, zeroY, panel.getWidth(), zeroY);

panel.paintComponents(g);
}

drawPoints 看起来像这样

private void drawPoints() {
for(int i = 0; i < points.size(); i++){
int x = Integer.parseInt(points.get(i)[1]);
int y = Integer.parseInt(points.get(i)[2]);
drawPoint(x, y);
}
}

private void drawPoint(int x, int y) {
Graphics g = panel.getGraphics();

for (int i = -1; i < 2; i++) {
g.drawLine(zeroX + x + i, zeroY + y - 1, zeroX + x + i, zeroY + y);
}

panel.paintComponents(g);
}

g.setColor(Color.BLACK);
g.drawLine(zeroX, 0, zeroX, panel.getHeight());
g.drawLine(0, zeroY, panel.getWidth(), zeroY);

panel.paintComponents(g);
}

drawConnections:

private void drawConnections(ArrayList<String[]> lines) {
for (String[] arr : lines) {
String x = arr[1];
String y = arr[2];

drawConnection(x, y);
}
}

private void drawConnection(String pointA, String pointB) {
int pointAX = 0, pointAY = 0, pointBX = 0, pointBY = 0;
Graphics g = panel.getGraphics();

for (String[] arr : points) {
if (arr[0].equals(pointA)) {
pointAX = Integer.parseInt(arr[1]);
pointAY = Integer.parseInt(arr[2]);
} else if (arr[0].equals(pointB)) {
pointBX = Integer.parseInt(arr[1]);
pointBY = Integer.parseInt(arr[2]);
}
}

g.drawLine(zeroX + pointAX, zeroY + pointAY, zeroX + pointBX, zeroY + pointBY);
panel.paintComponents(g);
}

我不明白的是,一切看起来都很好。我进行了调试,它看起来不错,在监听器调用结束时,当所有内容都被绘制时(尽管它绘制在旧的而不是清除它),它突然清除了所有内容,并且根本看不到任何东西。

最佳答案

您需要在 JPanel 类(或从中调用的方法)中的 paintComponent(Graphics) 中实现所有绘图。在面板实例上调用 getGraphics 并使用 Graphics 对象并不总是保证有效。同样奇怪的是,您调用 panel.repaint() 并立即尝试使用面板中的图形对象进行额外的绘制,该额外的绘制应该在 paintComponent(Graphics)< 中完成.

使用 paintComponent(Graphics) 将确保您的绘制在正确的时间完成,并且面板的图形将被清除(如果您至少调用 super 方法)。

关于java - 单击按钮后 Swing 自动重新绘制 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26895825/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com