4

我有 Java 小程序来绘制一个数组(只是一个接一个的矩形)。

当用户选择创建大小数组时n,它将绘制n连接在一起的矩形。当n变大时,图形会变大,但是由于我JPanel用来绘制数组并且JPanel不会滚动,所以我必须将其添加JPanel到 aJScrollPane中,但它仍然不会滚动。用户只能看到整个数组的一部分。

任何人都可以给我一些帮助吗?

这是我的代码:

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, not 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 回答