我正在测试以下内容。我想在每个按下鼠标的地方画一个矩形。我只希望在按下“c”键时清除屏幕。我希望我点击的每个地方都应该显示矩形。那没有发生。相反,仅显示我最后按下的矩形。似乎自动调用了 super.paintComponent(g)。我知道几年前情况并非如此。当我搜索 swing wiki 以及 swing tutorials 时,我找不到任何相关文档,但也许我搜索得还不够。
我不同意@kleopatra 的说法,这是重复。虽然 kleopatra 知道的很多(绝对比我多!),但所提供的示例都没有解决我的具体问题:paintComponent 中是否有对 super.paintComponent(g) 的自动调用?我提供的简单示例只是一个示例,用于说明我对我的问题的要求。我猜想可能有一个更好的例子可以使用。通常 super.paintComponent(g) 是我的第一行。另外,我有两台不同的电脑。在其中一台 Mac 上,只显示一个矩形。另一方面,一台带有较旧 jdk 的 pc,它们都出现了。我的问题与其他人的问题不同。
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class DrawRect extends JFrame
{
public DrawRect(){
super("Show Rectangles");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(800, 750);
DrawPanel dp = new DrawPanel();
setContentPane(dp);
setVisible(true);
}
public static void main (String[] args){
DrawRect dr = new DrawRect();
}
class DrawPanel extends JPanel implements MouseListener, KeyListener
{
private int xpos, ypos;
private boolean clearScreen;
public DrawPanel(){
xpos = ypos = 100;
clearScreen = true;
addMouseListener(this);
addKeyListener(this);
}
public void paintComponent ( Graphics g ){
if ( clearScreen ){
System.out.println("screen cleared");
super.paintComponent ( g );
}
else
g.fillRect(xpos,ypos,20,20);
clearScreen = false;
}
public void mousePressed(MouseEvent e){
requestFocusInWindow();
xpos = e.getX();
ypos = e.getY();
repaint();
}
public void mouseClicked(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void keyPressed(KeyEvent e){
if(e.getKeyChar() == 'c'){
clearScreen = true;
repaint();
}
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
}
}