【问题标题】:How does Java repaint() work? [closed]Java repaint() 是如何工作的? [关闭]
【发布时间】:2016-11-02 12:55:39
【问题描述】:

我想学习 java 绘画,所以我创建了一些代码来了解 java 绘画和重绘是如何工作的。这是 2 个代码示例,它们之间有什么区别?为什么重绘不起作用?

第一个代码示例(有效)

package com.oguz;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PaintTest3 extends JFrame{
    JPanel panel1;
    int i = 1;
    public PaintTest3() {
        panel1 = new JPanel();
        JButton btn = new JButton("Button");
        btn.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                i++;
                Graphics g = panel1.getGraphics();
                g.setColor(Color.BLACK);
                g.drawLine(10, 10, i * 5, 10);
            }
        });
        add(panel1);
        add(btn, BorderLayout.NORTH);
    }
    public static void main(String args[]){
        PaintTest3 pt = new PaintTest3();
        pt.setDefaultCloseOperation(EXIT_ON_CLOSE);
        pt.setSize(600, 500);
        pt.setVisible(true);
    }
}

【问题讨论】:

  • 你先告诉我们有什么不同,然后我们才能告诉你为什么重要。

标签: java paint paintcomponent repaint


【解决方案1】:

我试过你的第二个版本,它工作得很好。我唯一需要改变的就是将这条线进一步向下:g.drawLine(10, 100, i * 5, 100);,因为它被绘制在按钮后面。理想情况下,如果您想在某个区域内绘图,则可以使用自定义 paint 扩展 JPanel 并将其放在按钮下方。

为了进一步解释重绘 - “重绘”的目的是告诉窗口管理器您已经更改了需要重绘组件的内容。重绘操作将在稍后使用paint 进行(实际上在不同的线程中)。窗口管理器可能会为多次重绘调用绘制一次(如果它们发生得足够快)。你不应该在你自己的代码中调用paint:你实现它并让系统在需要时调用它。

您的第一个实现的问题是,如果必须在没有按下按钮的情况下进行绘制,则不会发生任何事情。例如,如果您调整窗口大小或最小化/最大化它。

因此,总而言之,您的第二个实现是正确的,您只需正确定位线条,理想情况下,绘制在面板而不是框架中。

【讨论】:

    【解决方案2】:

    repaint() 调用

    public void paint(Graphics g){}
    

    方法。这是为了简化编码过程,因为在较大的程序中会多次调用paint方法。每次我们都应该将 Graphics 对象作为参数传递。为了尽量减少这种情况,我们有 repaint()。

    【讨论】:

    • 但是我发布的第二个示例不起作用。我在 actionPerformed 中使用了 repaint()。
    • @user125318 那你的问题标题完全是误导。
    • 为什么?我不明白 repaint() 的工作。如果 repaint() 像 Shree Naath 提到的那样工作,为什么第二个样本不起作用?
    • 对不起,这个答案是完全错误的。 repaint 不仅仅是一种不需要传递图形对象来“简化编码过程”的绘制版本。它旨在为 Swing 的绘制线程排队一条指令。 paint 用于系统线程,repaint 用于应用程序线程。见oracle.com/technetwork/java/painting-140037.html
    猜你喜欢
    • 1970-01-01
    • 2015-05-13
    • 2013-10-04
    • 2017-08-23
    • 2013-05-05
    • 2010-11-07
    • 2013-05-19
    • 2016-10-01
    • 1970-01-01
    相关资源
    最近更新 更多