4

私は配列を描画するためのJavaアプレットを持っています(いくつかの長方形が次々と)。

ユーザーが size の配列の作成を選択すると、互いに接続された長方形nが描画されます。nn大きくなると、グラフィックスが大きくなりますがJPanel、配列を描画するために使用し、スクロールしないため、それをJPanelに追加する必要がありますが、それでもスクロールしません。ユーザーは配列全体の一部しか見ることができません。JPanelJScrollPane

誰か助けてくれませんか?

これが私のコードです:

public class ArrayPanel extends JPanel {
  ....

  public void paintComponent(Graphics g) {
    ...draw array here..
    // I wish to get the updated size of the graphis here,
    // then i can reset the preferredSize()....?
    System.out.println("width=" + getWidth() + " height=" + getHeight());
  }
}

public class ArrayDemo extends JPanel {
  public ArrayDemo() {
 super(new BorderLayout());

 arrayPanel = new ArrayPanel();
 arrayPanel.setPreferredSize(new Dimension(400, 300));

 JScrollPane container = new JScrollPane(arrayPanel,
         JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
         JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED );
 container.setPreferredSize(arrayPanel.getPreferredSize());
 add(container, BorderLayout.CENTER);
 ...
  }
}
4

1 に答える 1

3

でサイズを設定しないでくださいpaintComponent

あなたはそのコードを提供しませんでしたが、あなたはその配列のサイズとあなたの長方形のサイズを知っているあなたのコードのいくつかの位置を持っているので、JPanelそこにあなたの寸法を設定してください。

これは次のような例です(JFrameではなくApplet、を使用していますが、考え方は同じです)。

代替テキストhttp://img186.imageshack.us/img186/143/so2305419.png

public class ScrollPanelFrame extends JFrame{

    public ScrollPanelFrame() {
        ArrayPanel panel = new ArrayPanel(20, 20);
        JScrollPane container = new JScrollPane(
                panel,
                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED );
        getContentPane().add(container);
    }

    class ArrayPanel extends JPanel {
        final int RECTANGLE_WIDTH = 100;
        final int RECTANGLE_HEIGHT = 100;

        int rectangleCountX;
        int rectangleCountY;

        public ArrayPanel(int rectangleCountX, int rectangleCountY) {
            this.rectangleCountX = rectangleCountX;
            this.rectangleCountY = rectangleCountY;
            this.setPreferredSize(new Dimension(RECTANGLE_WIDTH * rectangleCountX,
                                                RECTANGLE_HEIGHT * rectangleCountY));
        }

        @Override
        public void paintComponent(Graphics g) {
            for(int x = 0 ; x < rectangleCountX ; x++) {
                for(int y = 0 ; y < rectangleCountY ; y++) {
                    g.setColor(new Color(0, 0, (x+y)*64 % 256));
                    g.fillRect(x*RECTANGLE_WIDTH, y*RECTANGLE_HEIGHT,
                               RECTANGLE_WIDTH, RECTANGLE_HEIGHT);
                }
            }
        }
    }

    public static void main(String[] args) {
        ScrollPanelFrame frame = new ScrollPanelFrame();
        frame.setSize(600, 400);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }
}
于 2010-02-21T09:23:13.470 に答える