如何改变图形的大小

4
我有一个Java applet来绘制一个数组(仅仅是一些矩形一个接一个地排列)。
当用户选择创建大小为n的数组时,它将绘制n个连接在一起的矩形。当n变得更大时,图形变得更大,但由于我使用JPanel来绘制数组,而且JPanel不会滚动,所以我必须将该JPanel添加到JScrollPane中,但仍然无法滚动。用户只能看到整个数组的一部分。
有人可以给我一些帮助吗?
这是我的代码:
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);
 ...
  }
}

@ohana:我已经重新格式化了您的问题以提高可读性,并更改了您提供的代码以避免滚动。如果您不同意,请随时回滚我的更改。 - Peter Lang
1个回答

3

不要在 paintComponent 中设置大小。

虽然你没有提供该代码,但是你的代码中某个位置应该知道那个数组的大小和矩形的大小,所以在那里设置你的 JPanel 的维度。

这里有一个例子(使用 JFrame,而不是 Applet,但是思路是一样的),它看起来像这样:

alt text 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);
    }
}

小错误: "y <= rectangleCountX" 应该是 "y <= rectangleCountY"。这不会改变程序的输出。 - Russ Hayward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接