当前位置: 首页 > 知识库问答 >
问题:

Java-如何从JPanel中清除图形

季骏祥
2023-03-14

我正在创建一个简单的程序,在那里我画一个黑色的椭圆形,在那里我用鼠标点击。然而,我希望一个新的椭圆形出现,旧的消失。我该怎么做?我把removeAll()方法插入到我的mousePressed方法中,但它对我不起作用。removeAll()方法是否适用于此?还是我应该用别的?很抱歉,如果答案很明显,但我仍然是新手,并试图学习。任何建议都将不胜感激。谢谢

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PaintPractice extends JPanel implements MouseListener {

    Random rand = new Random(); 
    int x = rand.nextInt(450);
    int y = rand.nextInt(450);

    public PaintPractice(){
        super();
        addMouseListener(this);
    }

    public static void main(String[] args){

        JFrame frame = new JFrame();
        PaintPractice panel = new PaintPractice();

        frame.setSize(500, 500);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(panel);        
    }

    public void paint(Graphics g){
        g.setColor(Color.BLACK);
        g.fillOval(x, y, 50, 50);
    }

    @Override
    public void mousePressed(MouseEvent e) {
        x = e.getX();
        y = e.getY();
        removeAll();
        repaint();      
    }

    @Override
    public void mouseClicked(MouseEvent e) {        
    }

    @Override
    public void mouseEntered(MouseEvent e) {        
    }

    @Override
    public void mouseExited(MouseEvent e) {     
    }

    @Override
    public void mouseReleased(MouseEvent e) {       
    }
}

共有3个答案

程景胜
2023-03-14

>

  • 由于JPanel是JComponent的一个子类,因此应该重写paintComponent而不是paint,并使用super。paintComponent(g)方法中的paintComponent(g)。

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
    

    使用removeAll时,JPanel中的所有组件(按钮、文本字段、标签等)都会被删除(如果有)。但是,您似乎没有向JPanel添加任何组件,因此没有必要调用此方法。

  • 林承悦
    2023-03-14

    如果你只想显示新创建的椭圆,一个可能的解决方法。将框架和面板设为静态,然后调用框架。按住鼠标中的setContentPane(面板)。

    另一种工作方法是在paint中调用g.clearRect(0,0,getWidth(),getHeight()),但这将使整个背景变为白色。

    易弘亮
    2023-03-14

    直接解决方法是调用super。在绘制(图形g)方法中绘制(g)。

    public void paint(Graphics g){
            super.paint(g);
            g.setColor(Color.BLACK);
            g.fillOval(x, y, 50, 50);
        }
    

    Javadoc解释了绘制机制:

    到目前为止,您已经知道应该放置所有绘画代码的地方是绘画组件方法。确实,当需要绘画时,会调用此方法,但绘画实际上是从更高的类继承权开始的,使用绘画方法(由java.awt.组件定义)。每当需要渲染组件时,绘画子系统都会执行此方法。它的签名是:

    • 公共空漆(图形g)

    javax.swing.JComponent扩展了这个类,并进一步将绘制方法分解为三个单独的方法,按以下顺序调用:

    • 受保护的组件(图形g)
    • 受保护的void paintBorder(图形g)
    • 受保护的void paintChildren(图形g)

    API并没有阻止您的代码重写paintBorder和paintChildren,但一般来说,您没有理由这么做。出于所有实际目的,paintComponent将是您需要覆盖的唯一方法。

    这就是为什么你的绘画练习应该调用super。改为绘制组件(g)。

    public void paintComponent(Graphics g) {    
        super.paintComponent(g);       
         g.setColor(Color.BLACK);
         g.fillOval(x, y, 50, 50);
    }  
    

    此外,您不需要在mousePressed(MouseEvent e)方法中调用removeAll()

        @Override
        public void mousePressed(MouseEvent e) {
            x = e.getX();
            y = e.getY();
            repaint();     
        }
    
     类似资料:
    • 问题内容: 当我需要时会出现一个新的JPanel(超过了时间限制或用户按下了“提交”按钮)。但是几秒钟后,旧的JPanel的某些元素就会与新的JPanel的组件一起出现。我不明白为什么会这样。 我以为是因为我必须对其他线程更新窗口。但是第一个线程只需将旧面板添加一次(因此,应该完成)。在第二个线程中,我有一个中断的循环(因此,它也应该完成)。 这是我的代码: 问题答案: 从容器(框架)中删除组件(

    • 下面是具有主面板和按钮函数的类的代码: 下面是一个完成所有图形工作并绘制JPanel的类

    • 问题内容: 我在gui中有一个jList,可以在其中使用“添加”按钮添加一些数据。我想添加另一个名为“清除”的按钮,它将清除所有元素。我尝试了这个: 当我点击添加按钮时,这将添加元素。 当我单击清除按钮时,这将删除元素。 但是,当我重新单击“添加”按钮时, 问题答案: 您不应该只是为了删除其中的某些项目而重新初始化整个JList小部件。相反,您应该操纵列表模型,因为对它的更改会“自动”同步回UI。

    • 问题内容: 我在寻找类似c ++函数 的原始类型。 还是应该只创建一个新地图? 更新:谢谢您的回答。通过查看答案,我刚刚意识到有时创建新地图可能会导致某些我们不希望出现的不一致情况。考虑以下示例: 我的意思是,这仍然与c ++中的功能不同,后者将清除对象中的内容。 问题答案: 您可能应该只创建一个新地图。没有真正的理由去尝试清除现有的代码,除非同一段映射被多个代码引用,并且一个代码段明确需要清除值

    • 问题内容: 我有一个缓存,其中包含对缓存对象的软引用。我正在尝试针对使用高速缓存的类的行为编写功能测试,专门用于清除高速缓存的对象时发生的情况。 问题是:我似乎无法可靠地清除软引用。简单地用完一堆内存并不能解决问题:在清除任何软引用之前,我会得到一个OutOfMemory。 有什么方法可以使Java更急切地清除软引用? 在这里 找到 : “尽管可以保证所有的SoftReferences在抛出Out

    • 我有一个如下定义的表视图 当用户单击时,我使用单击的项目详细信息重新加载表。在我重新加载之前,我对表项调用清除 现在,当我单击另一个项目并尝试重新加载表格时,它看起来像下面这样。这是非常奇怪的,因为应该只有一行,但行的大小是一样的,就像从以前的点击,其余的行是空的,除了图标。当我点击图标时,没有任何反应。任何人以前都面临过这种情况。有人知道这是什么原因吗? 我的工具定义如下。它们只是2 的