gpt4 book ai didi

java - 理解 JFrame 的 repaint() 命令

转载 作者:行者123 更新时间:2023-12-02 04:34:39 25 4
gpt4 key购买 nike

在尝试理解repaint()和paintComponent()的过程中,我在http://docs.oracle.com/javase/tutorial/uiswing/painting/step3.html上看到了这些代码:

import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseMotionAdapter;

public class SwingPaintDemo3 {

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}

private static void createAndShowGUI() {
System.out.println("Created GUI on EDT? "+
SwingUtilities.isEventDispatchThread());
JFrame f = new JFrame("Swing Paint Demo");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new MyPanel());
f.pack();
f.setVisible(true);
}
}

class MyPanel extends JPanel {

private int squareX = 50;
private int squareY = 50;
private int squareW = 20;
private int squareH = 20;

public MyPanel() {

setBorder(BorderFactory.createLineBorder(Color.black));

addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
moveSquare(e.getX(),e.getY());
}
});

addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent e) {
moveSquare(e.getX(),e.getY());
}
});

}

private void moveSquare(int x, int y) {
int OFFSET = 1;
if ((squareX!=x) || (squareY!=y)) {
repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
squareX=x;
squareY=y;
repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
}
}


public Dimension getPreferredSize() {
return new Dimension(250,200);
}

protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("This is my custom Panel!",10,20);
g.setColor(Color.RED);
g.fillRect(squareX,squareY,squareW,squareH);
g.setColor(Color.BLACK);
g.drawRect(squareX,squareY,squareW,squareH);
}
}

我对这些代码的问题是我不明白“repaint(squareX, squareY, squareW+offset,squareH+offset”这行代码。首先,我对 repaint() 的理解是它基本上只是调用 Paint( Graphics g) 或paintComponent(Graphics g),你显然不能像普通程序那样调用它,因为你不能真正输入图形,比如输入int或字符串。但是,这个程序的paintComponent()没有任何额外的输入(就像它可能有paintComponent(Graphics g,int squareX,int squareY,int squareW,int squareH)),那么给重绘的输入去哪里......?它有什么用?

最佳答案

I don't understand the line

"repaint(squareX, squareY, squareW+offset,squareH+offset". 

该代码用于重新绘制面板的一个小矩形区域,而不是重新绘制整个面板。绘制小区域显然比绘制小区域效率更高。

此外,该语句被调用两次。 repaint() 方法通过绘制请求调用 RepaintManager 来重新绘制两个矩形区域。 RepaintManager 会将两个请求合并为一个绘制请求,这又将使代码更加高效。

所以第一条语句用于清除矩形在其当前位置的绘制。然后,更改矩形的 x/y 位置,并发出第二个 repaint() 请求,以便可以在新位置重新绘制矩形。

尝试不使用第一个 repaint(...) 语句的代码,您会发现原始 Rectangle 并未完全清除,因此您会看到旧 Rectangle 的痕迹。

关于java - 理解 JFrame 的 repaint() 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31005417/

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