-1

このプログラムでは、相互作用してウェブを形成する一連の線を描きたいと考えています。タイマーが刻むたびに、線が描かれます。したがって、前の行を表示する必要が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();
    }
  }
}
4

1 に答える 1

2

前の行を表示する必要があるためです。

次に、インクリメンタル ペインティングを行う必要があります。これを行う 2 つの一般的な方法については、カスタム ペインティング アプローチを参照してください。

  1. ペイントするオブジェクトを保持し、List毎回それらを再ペイントします
  2. に絵を描きますBufferedImage
于 2014-05-24T03:21:52.647 に答える