9

こんにちは、私は 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();

    }

}
4

3 に答える 3

17

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

1) 使用JPanelおよび上書き(ビアドpaintComponentに追加するよりJPanelも)JFrameJFrame#add(..)

getPreferredSize()2) Graphics オブジェクトの描画に適合する正しい s を返すようにオーバーライドしDimensionます。そうしないと、JPanelコンポーネントのないサイズが 0,0として表示されません。

setSize3) 呼び出してはいけません ...すべてのコンポーネントを追加した後、可視に設定する前に、JFrame正しいLayoutManagerand/or overridegetPrefferedSize()を使用して呼び出しますpack()JFrame

4) Concurrency in Swing、特にEvent Dispatch Threadについて読んでください。

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

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

上記の修正を加えたコードは次のとおりです(画質が悪いですが、サイズを変更する必要があったか、800x600 になりました)。

ここに画像の説明を入力

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();
            }
        });
    }
}
于 2013-03-03T17:20:09.193 に答える
3

JFrame拡張JComponentしないため、オーバーライドしませんpaintComponent@Overrideこれは、注釈を追加することで確認できます。

この機能を取得するpaintComponentには、 を拡張する新しいクラスに抽出しますJComponentsuper.paintComponent(g)ではなく電話することを忘れないでくださいsuper.paintComponents(g)

于 2013-03-03T17:12:08.180 に答える
0

交換

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);

}  
于 2013-03-03T17:13:51.747 に答える