2

最近、Swing でいくつかの問題が発生しています。アルゴリズムのデータ構造を説明するために、下の画像のようなものをその場で作成しようとしています。

ノート画像
(ソース: ius.edu )

次のクラスで私がやろうとしていたのは、数字が入った長方形を描くことだけです。ただし、最後の四角形は 0,0 に描画されます。私は困惑しています。

JPanelループの後に(コメントアウト)を追加すると、期待どおりに描画されます。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class DrawingRect {

    public static void main(String[] args) {
        DrawingRect d = new DrawingRect();
    }

    public DrawingRect() {

        JFrame frame = new JFrame("Drawing a rect");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel swingPanel = new JPanel();
        swingPanel.setPreferredSize(new Dimension(500, 500));

        swingPanel.setVisible(true);

        swingPanel.setLayout(new BorderLayout(0, 0));

        int base = 15;
        for (int i = 1; i <= 25; i++) {
            Graphic re = new Graphic(i);

            //translating the graphic
            re.setBounds(base + 30 * i, base + 20 * i, 110, 110);


            swingPanel.add(re);
        }


        // if say I add a JPanel in here as the last element
        // then the boxes will draw correctly.
        //swingPanel.add(new JPanel());

        swingPanel.setPreferredSize(new Dimension(800, 600));

        frame.getContentPane().add(swingPanel);

        frame.pack();
        frame.setVisible(true);
    }

    public class Graphic extends JComponent {

        private static final long serialVersionUID = 1L;
        private static final int PREF_W = 100;
        private static final int PREF_H = 100;
        int id;

        public Graphic(int id) {
            this.id = id;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2 = (Graphics2D) g;
            g2.setColor(Color.black);

            g2.setColor(Color.black);
            g2.drawRoundRect(0, 0, 30, 30, 20, 20);

            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

            Font font = new Font("", Font.PLAIN, 13);
            g2.setFont(font);

            g2.drawString("" + id, 15, 20);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(PREF_W, PREF_H);
        }
    }
}   
4

2 に答える 2

3

のデフォルトのレイアウトJPanelですがFlowLayout、レイアウトがであるかのようにコンポーネントを配置していnullます。さらに、ネストされたコンポーネントが自動的に実行できるコンテンツを描画しています。

代わりに、をJPanel含むいくつかのJLabelを、を含むパネルに追加しGridLayoutます。必要に応じて空のパネルを使用します。外側のパネルをオーバーライドpaintComponent()して、接続線を描画します。

補遺:絶対ポジショニングを使用したいときはいつでもJInternalFrame、代替手段になる可能性があります。関連する例はここここにあります。

補遺:プロジェクトがプロトタイプ段階を超えて成長する場合は、カスタムレイアウトマネージャーも検討してください。

于 2012-04-13T21:01:38.797 に答える
2

それは、BorderLayout を使用しているためです。add 行を変更して特定のレイアウトの場所を含めることで、これをテストできます: swingPanel.add(re,BorderLayout.SOUTH)

解決策として、画像にすべての長方形を描画し、ループの最後に更新してみませんか? または、JPanel への追加はデモンストレーションの一部ですか?

于 2012-04-13T21:20:34.797 に答える