我想学习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);
}
}
答案 0 :(得分:1)
我尝试了你的第二个版本,它运行得非常好。我唯一需要改变的是让线条进一步向下:g.drawLine(10, 100, i * 5, 100);
,因为它是在按钮后面绘制的。理想情况下,如果您想绘制区域,则可以使用自定义paint
扩展JPanel,并将其放在按钮下方。
进一步解释重绘 - 重点'是告诉窗口管理器你已经改变了需要重新绘制组件的东西。重绘操作将在稍后(实际上在不同的线程中)使用paint
发生。窗口管理器可能会为多次重绘调用绘制一次(如果它们发生得足够快)。您不应该在自己的代码中调用paint
:您实现它并让系统在需要时调用它。
第一次实现的问题是如果在没有按下按钮的情况下必须进行绘制,则不会发生任何事情。例如,如果您调整窗口大小或最小化/最大化它。
所以,总而言之,你的第二个实现是正确的,你只需要正确定位你的线,理想情况下,在面板而不是框架中绘制。
答案 1 :(得分:0)
repaint()调用
public void paint(Graphics g){}
方法。这是为了简化编码过程,因为在更大的程序中将多次调用paint方法。每次我们都应该将Graphics对象作为参数传递。为了最小化这个,我们有repaint()。