如何在不使用paintComponent()中的超级调用的情况下在JPanel中设置背景

时间:2014-05-24 03:14:21

标签: java swing jpanel paintcomponent setbackground

在这个程序中,我想绘制一系列相互作用形成网络的线条。每次计时器滴答时,都会绘制一条线。因此,我无法在super.paintComponent(g)中进行paintComponent()调用,因为我需要显示之前的行。但是,我想设置背景颜色,据我所知,只有在首次进行超级调用时才能调用setBackground()方法。我不确定fillRect方法是否有效,因为它每次都会在旧行上绘制一个矩形。我尝试在构造函数中使用setBackground()方法,但它也不起作用。

这是我的代码:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class prettyWebPanel extends JPanel implements ActionListener {
  Timer time = new Timer(100,this);
  private Color colour1 = Color.black;
  private Color colour2 = Color.white;
  JButton start = new JButton("Start");
  int j = 0;

  public prettyWebPanel() {
    setPreferredSize(new Dimension (550,550));
    this.add(start);
    start.addActionListener(this);
    setBackground(colour1);
  }

  public void paintComponent(Graphics g) {
    setBackground(colour1);
    setForeground(colour2);
    if (j<490) g.drawLine(20, 20+j, 20+j, 500);
  }

  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == start) time.start();
    else if (e.getSource() == time) {
      j+=10;
      repaint();
    }
  }
}

1 个答案:

答案 0 :(得分:2)

  

因为我需要显示前面的行。

然后你需要做增量绘画。有关实现此目的的两种常用方法,请参阅Custom Painting Approaches

  1. 每次
  2. 保持List个对象进行绘制和重绘
  3. 将绘画放到BufferedImage