Graphics绘制:是否一直自动调用super.paintComponent? [重复]

问题描述 投票:0回答:0

我正在测试以下内容。我想在每个按下鼠标的地方画一个矩形。我只希望在按下“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) {}
    }
}


java swing graphics paintcomponent
© www.soinside.com 2019 - 2024. All rights reserved.