2010-02-21 101 views
4

我有Java小程序绘制一个数组(只是一个接一个的矩形)。如何更改图形的大小

当用户选择创建大小为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); 
... 
    } 
} 
+0

@ohana:我已经重新格式化你的问题的更好的可读性,和您提供的代码以避免滚动。如果您不同意,请随时回滚我的更改。 – 2010-02-21 09:52:13

回答

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); 
    } 
} 
+0

小错字:“y <= rectangleCountX”应该是“y <= rectangleCountY”。不改变程序的输出。 – 2010-02-21 10:22:53

+0

@Russ Hayward:谢谢,我纠正了这一点。 – 2010-02-21 13:50:36

+0

谢谢,它的作品! :) – ohana 2010-02-22 02:00:20