0

だから私はここで決勝戦に向けて勉強しているだけで、これをうまく機能させるのに苦労しています。以前私がいつも行っていたことは、paintComponent(Graphics g) を呼び出すことであり、物事はうまく機能しました。しかし、コンパイルしようとすると、「paintComponent has protected access in JComponent」というエラーが表示されます。コンパイルできるようにする唯一の方法は、ペイントを呼び出すように指示することでした。しかし、コンパイルしても、アプレット ウィンドウでペイントが呼び出されることはありません。ここには何が表示されていませんか?

 public class LineDraw extends JComponent
 {
private final Point p1;
private final Point p2;
private final JApplet callingWindow;
private final ArrayList<Line2D.Double> lines;

public LineDraw(JApplet callingWindow)
{
    this.p1 = new Point();
    this.p2 = new Point();
    this.callingWindow = callingWindow;
    this.lines = new ArrayList<Line2D.Double>();
    MouseListener mouse = new MouseHandler();
    callingWindow.addMouseListener(mouse);
}

public class MouseHandler extends MouseAdapter
{
    private boolean firstClick;
    public MouseHandler()
    {
        firstClick = true;
    }
    public void mouseClicked(MouseEvent e)
    {
        if(firstClick)
        {
            p1.setLocation(e.getPoint());
            firstClick = false;
        }
        else    
        {
            p2.setLocation(e.getPoint());
            lines.add(new Line2D.Double(p1, p2));
            p2.setLocation(p1.getLocation());
            callingWindow.repaint();        
        }
    }

    public void paintComponent(Graphics2D g2)
    {
        for(Line2D.Double e: lines)
        {
            g2.draw(e);
        }
    }
}

}

そしてアプレットクラス自体

    public class AppletWin extends JApplet
    {
private LineDraw lineDrawer;

public void init()
{
    setBackground(Color.white);
    lineDrawer = new LineDraw(this);
}

public void paint(Graphics h)
{
    Graphics2D g = (Graphics2D)h;
    //Clear background
    g.setColor(getBackground());
    g.fillRect(1, 1, getWidth(), getHeight());
    lineDrawer.paintComponent(g);  
}
    }
4

2 に答える 2

1

LineDrawerはコンポーネントです。アプレットに追加すると、自動的にペイントされます。

あなたは名前の衝突の問題に陥ったようです。

JComponentペイントの2つの方法を定義します(実際にはさらにいくつか定義しますが、シンプルに保ちます)、paintおよびpaintComponent

あなたが抱えている問題は、あなたがから受け継いだが、JComponentあなた自身の絵を描いているように見えるという事実に関係しています。独自の「ペインター」クラスを開発したいが、Swingコンポーネントに反する場合、これは問題ありません。Swingコンポーネントには、単にペイントするだけではありません。

あなたが抱えている他の問題は、sideメソッドで「paint」メソッドを定義していて、それがクラスMouseHandlerから呼び出し可能であると想定しているように見えることです。LineDraw問題は、あなたが実際にJComponent'spaintメソッドを呼び出しているのであって、あなたが望んでいる/思っているメソッドではないということです。

を削除して、メソッドをクラスextends JComponentに移動してみてください。paintLineDraw

MouseEventが述べているように、ほとんどの場合、電話をかけpaintたり、paintComponent直接電話したりしないでください。

あなたは見つけるかもしれません:

役に立った

更新しました

スイングコンポーネントとしてのペイント

public class AppletWin extends JApplet {

    private LineDraw lineDrawer;

    public void init() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                setBackground(Color.white);
                lineDrawer = new LineDraw(AppletWin.this);
                setLayout(new BorderLayout());
                add(lineDrawer);
            }
        });
    }

    public class LineDraw extends JComponent {

        private final Point p1;
        private final Point p2;
        private final JApplet callingWindow;
        private final ArrayList<Line2D.Double> lines;

        public LineDraw(JApplet callingWindow) {
            this.p1 = new Point();
            this.p2 = new Point();
            this.callingWindow = callingWindow;
            this.lines = new ArrayList<Line2D.Double>();
            MouseListener mouse = new MouseHandler();
            addMouseListener(mouse);
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setColor(Color.RED);
            for (Line2D.Double e : lines) {
                g2.draw(e);
            }
        }

        public class MouseHandler extends MouseAdapter {

            private boolean firstClick;

            public MouseHandler() {
                firstClick = true;
            }

            public void mouseClicked(MouseEvent e) {
                if (firstClick) {
                    p1.setLocation(e.getPoint());
                    firstClick = false;
                } else {
                    p2.setLocation(e.getPoint());
                    lines.add(new Line2D.Double(p1, p2));
                    p2.setLocation(p1.getLocation());
                }
                repaint();
            }
        }
    }
}

画家として

public class AppletWin extends JApplet {

    private LineDraw lineDrawer;

    public void init() {
        setBackground(Color.white);
        lineDrawer = new LineDraw(this);
    }

    public void paint(Graphics h) {
        // The the applet clear the background
        super.paint(h);
        Graphics2D g = (Graphics2D) h;
        lineDrawer.paintComponent(g);
    }
    public class LineDraw {

        private final Point p1;
        private final Point p2;
        private final JApplet callingWindow;
        private final ArrayList<Line2D.Double> lines;

        public LineDraw(JApplet callingWindow) {
            this.p1 = new Point();
            this.p2 = new Point();
            this.callingWindow = callingWindow;
            this.lines = new ArrayList<Line2D.Double>();
            MouseListener mouse = new MouseHandler();
            callingWindow.addMouseListener(mouse);
        }

        public void paintComponent(Graphics2D g2) {
            System.out.println("...");
            for (Line2D.Double e : lines) {
                g2.draw(e);
            }
        }

        public class MouseHandler extends MouseAdapter {

            private boolean firstClick;

            public MouseHandler() {
                firstClick = true;
            }

            public void mouseClicked(MouseEvent e) {
                if (firstClick) {
                    p1.setLocation(e.getPoint());
                    firstClick = false;
                } else {
                    p2.setLocation(e.getPoint());
                    lines.add(new Line2D.Double(p1, p2));
                    p2.setLocation(p1.getLocation());
                }
                callingWindow.repaint();
            }
        }
    }
}

paintトップレベルのコンテナのメソッドをオーバーライドすることは本当に避けてください。このpaintメソッドは非常に複雑なメソッドであり、それを回避すると、長期的には問題が発生するだけでなく、ダブルバッファリングされません;)

于 2012-12-05T05:44:15.323 に答える
0

このコードの問題は、LineDraw の paintComponent メソッドが内部クラス MouseHandler 内にあることです。

于 2012-12-05T05:49:46.523 に答える