web-dev-qa-db-ja.com

javaでのポリゴンの描画について

こんにちは。Java2Dについて自分自身を改善しようとしています。まず、ポリゴンの描画を扱います。ただし、フレームにポリゴンが表示されません。私はいくつかのチュートリアルと例を読みましたが、私が言ったように私は問題に直面しています。以下は、ポリゴンを描画するサンプルコードです。

import Java.awt.Color;
import Java.awt.Graphics;
import Java.awt.Polygon;

import javax.swing.JFrame;

public class jRisk extends JFrame {


    private JFrame mainMap;
    private Polygon poly;

    public jRisk(){

        initComponents();

    }

    private void initComponents(){

        mainMap = new JFrame();
        mainMap.setSize(800, 600);
        mainMap.setResizable(false);

        mainMap.setVisible(true);
        mainMap.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        int xPoly[] = {150,250,325,375,450,275,100};
        int yPoly[] = {150,100,125,225,250,375,300};

        poly = new Polygon(xPoly, yPoly, xPoly.length);

    }

    protected void paintComponent(Graphics g){

        super.paintComponents(g);

        g.setColor(Color.BLUE);
        g.drawPolygon(poly);

    }   

    /**
     * @param args
     */
    public static void main(String[] args) {

        new jRisk();

    }

}
9
quartaela

JFrameには paintComponent(Graphics g) メソッドがありません。 _@Override_注釈 を追加すると、コンパイル時エラーが発生します。

1)JPanelを使用してpaintComponentをオーバーライドします(JPanel viad JFrame#add(..)JFrameを追加します)

2)getPreferredSize()をオーバーライドして、グラフィックスオブジェクトの描画に適合する正しいDimensionsを返すか、コンポーネントなしでJPanelサイズとして表示されません0,0

3)setSizeJFrameを呼び出さないでください...正しいLayoutManagerを使用するか、getPrefferedSize()をオーバーライドしてpack()を呼び出しますすべてのコンポーネントを追加した後、可視に設定する前のJFrame

4) Swingの同時実行性 について、特に Event Dispatch Thread について読んでください。

5)時計クラスの命名スキームは大文字で始め、新しい単語の最初の文字はすべて大文字にする必要があります

6)また、あなたは_extend JFrame_であり、変数JFrameを持っていますか? _extend JFrame_を取り除き、JFrame変数を保持します。2JFramesは必要ないため、機能を追加しない限り、JFrameを拡張することはお勧めしません。

上記の修正を加えたコードを次に示します(画質がすいませんが、サイズを変更するか、800x600にしました)。

enter image description here

_import Java.awt.Color;
import Java.awt.Dimension;
import Java.awt.Graphics;
import Java.awt.Polygon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class JRisk {

    private JFrame mainMap;
    private Polygon poly;

    public JRisk() {

        initComponents();

    }

    private void initComponents() {

        mainMap = new JFrame();
        mainMap.setResizable(false);

        mainMap.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        int xPoly[] = {150, 250, 325, 375, 450, 275, 100};
        int yPoly[] = {150, 100, 125, 225, 250, 375, 300};

        poly = new Polygon(xPoly, yPoly, xPoly.length);
        JPanel p = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.BLUE);
                g.drawPolygon(poly);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(800, 600);
            }
        };
        mainMap.add(p);
        mainMap.pack();
        mainMap.setVisible(true);

    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JRisk();
            }
        });
    }
}
_

あなたのコメントに従って:

たくさんのポリゴンを含むマップを準備しています。昨日はJFrameでJPanelを使用し、マウスがポリゴン内にあるかどうかをMouseListenerで確認しようとしました。後で、mouseListenerが誤った応答を返したことを確認しました(マウスがポリゴンの内側にないようですが、ポリゴンの内側のように動作します)。 JPanelを削除したのでうまくいきました

以下は、MouseAdapterでコードを更新し、mouseClickedをオーバーライドして、クリックがポリゴン内であったかどうかを確認します。

_import Java.awt.Color;
import Java.awt.Dimension;
import Java.awt.Graphics;
import Java.awt.Polygon;
import Java.awt.event.MouseAdapter;
import Java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class JRisk {

    private JFrame mainMap;
    private Polygon poly;

    public JRisk() {
        initComponents();
    }

    private void initComponents() {

        mainMap = new JFrame();
        mainMap.setResizable(false);

        mainMap.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        int xPoly[] = {150, 250, 325, 375, 450, 275, 100};
        int yPoly[] = {150, 100, 125, 225, 250, 375, 300};

        poly = new Polygon(xPoly, yPoly, xPoly.length);

        JPanel p = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.BLUE);
                g.drawPolygon(poly);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(800, 600);
            }
        };

        MouseAdapter ma = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                super.mouseClicked(me);

                if (poly.contains(me.getPoint())) {
                    System.out.println("Clicked polygon");
                }

            }
        };
        p.addMouseListener(ma);//add listener to panel
        mainMap.add(p);

        mainMap.pack();
        mainMap.setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JRisk();
            }
        });
    }
}
_
16
David Kroukamp

JFrameJComponentを拡張しないため、paintComponentをオーバーライドしません。これを確認するには、_@Override_アノテーションを追加します。

この機能を使用するには、paintComponentJComponentを拡張する新しいクラスに抽出します。 super.paintComponent(g)ではなくsuper.paintComponents(g)を呼び出すことを忘れないでください。

3
Reimeus

交換する

protected void paintComponent(Graphics g){

    super.paintComponents(g);

    g.setColor(Color.BLUE);
    g.drawPolygon(poly);

}   

protected void Paint(Graphics g){

    super.Paint(g);

    g.setColor(Color.BLUE);
    g.drawPolygon(poly);

}  
0
christopher