2010-02-21 133 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