1

私は、メッセージの下に配置されたターゲットのロゴとともに「ターゲットへようこそ」と言うパネルを作成するプロジェクトJPanelsを行っています。JFrames私が持っているクラスは、Main、TargetLogoPanel、および TargetLogoUI です。Netbeans 7.1 に実装された設計関数をいじってみましたが、楕円をそのように描画する方法が見つからなかったため、次のコードを追加しました。

@Override
protected void paintComponent(Graphics g) {
    g.setColor(Color.red);
    g.fillOval(((targetPanel.getWidth()) / 2) - 100,
            ((targetPanel.getHeight()) / 2) - 100, 200, 200);
    g.setColor(Color.WHITE);
    g.fillOval(((targetPanel.getWidth()) / 2) - 65,
            ((targetPanel.getHeight()) / 2) - 65, 130, 130);
    g.setColor(Color.red);
    g.fillOval(((targetPanel.getWidth()) / 2) - 30,
            ((targetPanel.getHeight()) / 2) - 30, 60, 60);

}

ロゴは幅 200 ピクセルで、フレームのサイズを変更しても中央に配置されます。ただし、追加しただけでは、プログラムを実行すると円が描画されません。私の主な方法では、new TargetLogoUI().setVisible(true); ここで何が間違っていますか?

4

2 に答える 2

1

あなたが提供したスニペットには多くの問題があります。

  • あなたはハード(マジック)ナンバーに頼っています。これが機能する場合もありますが、これは危険な行為であり、避けるようにしてください。
  • 親コンテナーのレイアウト マネージャーにサイズのヒントを提供していないようです。これは通常、コンポーネントがレイアウト マネージャーに 0x0 スペースを要求することを意味します。
  • super.paintComponentコンポーネントが適切に描画されるようにするために必要な を呼び出していません。
  • 外部リソースからの情報に依存して、コンテナーを配置しようとしています。これは の仕事ではなくpaint、レイアウト マネージャーの仕事です。

これらはスニペットから確認できるものであり、他にも問題がある可能性があります。

public class Target {

    public static void main(String[] args) {
        new Target();
    }

    public Target() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

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

        protected void paintComponent(Graphics g) {

            super.paintComponent(g);

            int width = getWidth();
            int height = getHeight();

            int radius = Math.min(width, height);

            g.setColor(Color.red);
            g.fillOval(
                    (int)((radius / 2) - (radius * 0.5)),
                    (int)((radius / 2) - (radius * 0.5)), 
                    (int)radius, 
                    (int)radius);
            g.setColor(Color.WHITE);
            g.fillOval(
                    (int)((radius / 2) - (radius * 0.325)),
                    (int)((radius / 2) - (radius * 0.325)), 
                    (int)(radius * 0.65), 
                    (int)(radius * 0.65));
            g.setColor(Color.red);
            g.fillOval(
                    (int)((radius / 2) - (radius * 0.15)),
                    (int)((radius / 2) - (radius * 0.15)), 
                    (int)(radius * 0.3), 
                    (int)(radius * 0.3));

        }
    }
}
于 2013-02-28T00:35:33.327 に答える
0

Google でブルズアイを検索したところ、この例に出会いました。私は以下の変更を提供しましたJPanel

を設定してrings = 3、赤/白を反転しましたpaintComponent()

class Bullseye extends JPanel {
  static final int SIZE = 300; // initial window size
  int rings = 3; // Number of rings to draw in bullseye

  public Bullseye() {
    this.setBackground(Color.white);
    this.setPreferredSize(new Dimension(SIZE, SIZE));
  }

  public void setRings(int r) {
    rings = r;
    this.repaint(); // new value of rings - better repaint
  }

  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    // x,y coordinate of top left corner for drawing circles
    int x = SIZE / 2;
    int y = SIZE / 2;

    for (int i = rings; i > 0; i--) {
      if (i % 2 == 0)
        g.setColor(Color.white);
      else
        g.setColor(Color.red);
      int radius = i * 100 / rings; // compute radius of this ring
      g.fillOval(x - radius, y - radius, radius * 2, radius * 2);
    }
  }
}
于 2013-02-28T00:22:32.297 に答える