2

repaint()を拡張するクラスの方法を理解しようとしていJComponentます。各クラスを拡張JComponentしてから、独自のpaintComponent(). ( super.paintComponent()。この方法で、サークル クラスまたは作成したい任意のクラスを作成できます。それが にrepaint()追加されている限り、必要なときにいつでも作成できます。以下は、必要なすべてのコードです。走る。JPanelJFrame

クラス 1:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class DDHGenericFrame extends JFrame {

    private static final long serialVersionUID = 1L;

    /* User defined class that is below */
    DDHGenericPanel d = new DDHGenericPanel(); 

    public DDHGenericFrame() {
        initUI();
    }

    public final void initUI() {
        add(d);
        setSize(650, 350);
        setTitle("Lines");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        DDHGenericFrame ex = new DDHGenericFrame();
        ex.setVisible(true);
    }
}

クラス 2:

import java.awt.Graphics;
import javax.swing.JPanel;

class DDHGenericPanel extends JPanel {
    private static final long serialVersionUID = 1L;

    DDHGenericPanel() {
        System.out.println("DDH Generic JPanel");
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        //paint code goes here of whatever
    }
}

クラス 3:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;

public class DDHCircleOne extends JComponent {
    private static final long serialVersionUID = 1L;

    int counter = 0;

    public DDHCircleOne() {
        counter++;
        System.out.println("DDHCircle Constructor");
    }

    public void paintComponent(Graphics g2) {
        super.paintComponent(g2);
        Graphics2D c2D = (Graphics2D) g2;
        c2D.setColor(Color.yellow);
        c2D.fillRect(0, 0, getSize().width, getSize().height);
        if (counter % 2 == 2) {
            System.out.println("RED");
            counter++;
            c2D.setColor(Color.red);
            c2D.fillRect(0, 0, getSize().width, getSize().height);
        } else {
            System.out.println("BLUE");
            counter++;
            c2D.setColor(Color.blue);
            c2D.fillRect(0, 0, getSize().width, getSize().height);
        }
    }
}

上記の 3 つのクラスは、パッケージに含まれているものです。DDHCircleOneインスタンスが作成され、メソッドが呼び出されるたびに、自分で再描画できるようにしたいと考えていますrepaint()。このようにして、拡張JComponentしてからオーバーライドしてpaintComponent()から呼び出すクラスを作成できますrepaint()

赤で再描画するボタンと青で再描画する別のボタンがある場合、フレーム内にある円または何かvariableName.repaint()が呼び出されると、それ自体が再描画されます。

doauuf@outlook.com

4

1 に答える 1

3
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    repaint();
}

描画メソッドで repaint() を呼び出さないでください。これにより、無限ループが発生します。

汎用パネルは必要ありません。任意のパネルにコンポーネントを追加できます。

円の色を変更したい場合は、コンポーネントのプロパティを変更する必要があります。たとえば、 setForeground(...) メソッドを使用して色を変更できます。

//c2D.setColor(Color.red);
c2D.setColor( getForeground() );

したがって、ボタンをクリックすると、 circle.setForeground(Color.RED); が呼び出されます。

JComponent の setForeground() メソッドは、コンポーネントの repaint() メソッドを呼び出します。

于 2013-11-10T20:57:58.973 に答える