Java repaint() 是如何工作的?
How does Java repaint() work?
我想学习 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);
}
}
repaint() 调用
public void paint(Graphics g){}
方法。这是为了简化编码过程,因为在较大的程序中将多次调用 paint 方法。每次我们都应该将 Graphics 对象作为参数传递。为了尽量减少这种情况,我们有 repaint()。
我试过你的第二个版本,效果很好。我唯一需要更改的是将线进一步向下:g.drawLine(10, 100, i * 5, 100);
因为它被绘制在按钮后面。理想情况下,如果你想在一个区域中绘制,那么你可以使用自定义 paint
扩展 JPanel 并将其放在按钮下方。
进一步解释重绘 - 'repaint' 的目的是告诉 window 管理器您更改了需要重绘组件的内容。重绘操作将在稍后使用 paint
发生(实际上在不同的线程中)。 window 管理器可能会为多个重绘调用绘制一次(如果它们发生得足够快)。您不应该在自己的代码中调用 paint
:您实现它并让系统在需要时调用它。
您的第一个实现的问题是,如果必须在没有按下按钮的情况下进行绘制,则什么也不会发生。例如,如果您调整 window 或 minimize/maximize 的大小。
因此,总而言之,您的第二个实现是正确的,您只需要正确定位您的线,理想情况下,在面板而不是框架中绘制。
我想学习 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);
}
}
repaint() 调用
public void paint(Graphics g){}
方法。这是为了简化编码过程,因为在较大的程序中将多次调用 paint 方法。每次我们都应该将 Graphics 对象作为参数传递。为了尽量减少这种情况,我们有 repaint()。
我试过你的第二个版本,效果很好。我唯一需要更改的是将线进一步向下:g.drawLine(10, 100, i * 5, 100);
因为它被绘制在按钮后面。理想情况下,如果你想在一个区域中绘制,那么你可以使用自定义 paint
扩展 JPanel 并将其放在按钮下方。
进一步解释重绘 - 'repaint' 的目的是告诉 window 管理器您更改了需要重绘组件的内容。重绘操作将在稍后使用 paint
发生(实际上在不同的线程中)。 window 管理器可能会为多个重绘调用绘制一次(如果它们发生得足够快)。您不应该在自己的代码中调用 paint
:您实现它并让系统在需要时调用它。
您的第一个实现的问题是,如果必须在没有按下按钮的情况下进行绘制,则什么也不会发生。例如,如果您调整 window 或 minimize/maximize 的大小。
因此,总而言之,您的第二个实现是正确的,您只需要正确定位您的线,理想情况下,在面板而不是框架中绘制。