当前位置: 首页 > 面试题库 >

Repaint()不能清除框架

洪鸿
2023-03-14
问题内容
public class Graphics2DTest extends JPanel implements ActionListener{
private Timer time = new Timer(5,(ActionListener) this);
int x = 0,y = 0;
public void paintComponent(Graphics g){

    Graphics2D gui = (Graphics2D) g;
    Rectangle2D rectangle = new Rectangle2D.Double(x,y,100,150);
    gui.setPaint(Color.GREEN);
    gui.fill(rectangle);
    time.start();
}

public void actionPerformed(ActionEvent arg0) {
    x++;
    y++;
    repaint();
}
}

问题是repaint()应该清除框架并在该位置绘制矩形,但是保留先前绘制的矩形。那么,该怎么做呢?请解释您的答案。


问题答案:

您是否尝试过在paintComponent方法中调用super.paintComponent(g)?这将清除您的JPanel中绘制的先前图像:

public void paintComponent(Graphics g){
  super.paintComponent(g);
  Graphics2D gui = (Graphics2D) g;
  Rectangle2D rectangle = new Rectangle2D.Double(x,y,100,150);
  gui.setPaint(Color.GREEN);
  gui.fill(rectangle);
  //time.start();
}

另外,不要启动计时器或在paintComponent方法内执行任何程序逻辑。首先,您不能完全控制何时或是否将调用该方法,其次,此方法必须仅与绘画有关,而与其他无关,并且需要尽可能快。

例如:

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

import javax.swing.*;

public class Graphics2DTest extends JPanel implements ActionListener {
    private Timer time = new Timer(5, (ActionListener) this);
    int x = 0, y = 0;

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D gui = (Graphics2D) g;
        Rectangle2D rectangle = new Rectangle2D.Double(x, y, 100, 150);
        gui.setPaint(Color.GREEN);
        gui.fill(rectangle);
        //time.start();
    }

    public void actionPerformed(ActionEvent arg0) {
        x++;
        y++;
        repaint();
    }

    public Graphics2DTest() {
        setPreferredSize(new Dimension(700, 500));
        time.start();
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("Graphics2DTest");
        frame.getContentPane().add(new Graphics2DTest());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }
}


 类似资料:
  • 问题内容: 我正在尝试清除tkinter中的框架,以便可以写入新内容(刷新信息),但是我无法做到这一点。我知道这些 但是frame.destroy()会完全删除框架。另外两个也不能给我我想要的结果。我需要的只是 清除框架中的每个项目,但框架本身会保留下来 。反正有做吗? 问题答案: 并且只会从视图中删除小部件,不会破坏它们。如果您不打算重复使用这些小部件,那么唯一的选择就是使用方法销毁它们。 为此

  • 本文向大家介绍Android输入框控件ClearEditText实现清除功能,包括了Android输入框控件ClearEditText实现清除功能的使用技巧和注意事项,需要的朋友参考一下 本文给大家带来一个很实用的小控件ClearEditText,就是在Android系统的输入框右边加入一个小图标,点击小图标可以清除输入框里面的内容,IOS上面直接设置某个属性就可以实现这一功能,但是Android

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

  • 我在一个数字海洋Ubuntu虚拟机上运行一个独立的清漆实例,基本上运行良好。该设置用于加载一个位于其他任何地方的旧wordpress服务器。这工作得很好,但我很难清除内容。当谈到清除时,我的意思是使URL的缓存无效,以迫使清漆从后端获取新版本(只是为了确保我看到了一些关于清除/禁止的恼怒)。 我已经为清除设置了一个ACL,就我所能看到的varnishlog的清除被接受了-从WordPress博客的

  • 问题内容: 我正在研究模仿Paint的程序。问题是当我绘制新形状时,以前的形状会被删除。我试图注释掉我的paintComponents的超级调用,该调用可以工作,但是留下了太多的绘图。 问题答案: 正如您所发现的,您需要调用,否则背景不会被绘制,并且一切都是一团糟。问题在于,由于该字段只能是单个值,因此一次只能绘制一个形状。一种解决方案是创建一个形状,然后在in中绘制每个形状。

  • 在试图制作一个非常简单的子弹地狱游戏来学习java时,我遇到了一个障碍: repaint()没有调用油漆组件()。 这是整个程序,目前只需将我每秒创建50次的图像绘制到JFrame上的JPanel上。 在使用断点和println方法进行了一些调试之后,我可以确认正在读取正确的图像,gameTimerAction中的计时器每秒被调用50次,并且repaint()根本没有调用paintComponen