2012-06-19 69 views
4

我剛剛學習Swing,併爲自己構建了一個示例GUI。非常基本,它有JFrame的西側,中間和東側的三個面板。在最後一個面板中,還有另一個面板和一個按鈕。面板是我的JPanel,DrawPanel的擴展。每次點擊它時,它會隨機抽取Rectangle重新點擊被點擊。這是我的代碼:在Swing中無法正確設置JPanel的尺寸

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Tester 
{ 
    public static DrawPanel panelEastDrawPanelCenter; 

    public static void main() 
    { 
     Tester gui = new Tester(); 
     gui.go(); 
    } 
    public void go() 
    { 
     JFrame frame = new JFrame("This is the title"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Create all the Western Panel components 
     JPanel panelWest = new JPanel(); 
     // panelWest.setLayout(new BorderLayout()); 
     JButton panelWestButtonWest = new JButton("Western-most West Button"); 
     JButton panelWestButtonCenter = new JButton("Western-most Center Button"); 
     JButton panelWestButtonEast = new JButton("Western-most East Button"); 

     // Create all Center Panel components 
     JPanel panelCenter = new JPanel(); 
      panelCenter.setBackground(Color.darkGray); 
     JButton panelCenterButtonCenter = new JButton("Center Button"); 

     // Create all East Panel components 
     JPanel panelEast = new JPanel(); 
     panelEastDrawPanelCenter = new DrawPanel(); 
      panelEastDrawPanelCenter.setSize(50,50); 
     JButton panelEastButtonSouth = new JButton("Repaint"); 
      panelEastButtonSouth.addActionListener(new panelEastButtonSouthListener()); 

     // Add everything to the GUI 
     // West Panel 
     frame.getContentPane().add(BorderLayout.WEST, panelWest); 
     panelWest.add(BorderLayout.WEST, panelWestButtonWest); 
     panelWest.add(BorderLayout.CENTER, panelWestButtonCenter);  
     panelWest.add(BorderLayout.EAST, panelWestButtonEast); 

     // Center Panel 
     frame.getContentPane().add(BorderLayout.CENTER, panelCenter); 
     panelCenter.add(BorderLayout.CENTER, panelCenterButtonCenter); 

     // East Panel 
     frame.getContentPane().add(BorderLayout.EAST, panelEast); 
     panelEast.add(panelEastDrawPanelCenter); 
     panelEast.add(panelEastButtonSouth); 

     frame.pack(); 
     //frame.setSize(frame.getWidth(), 500); 
     frame.setVisible(true); 
    } 
    class panelEastButtonSouthListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent event) 
     { 
      panelEastDrawPanelCenter.repaint(); 
     } 
    } 
    class DrawPanel extends JPanel // JPanel that displays a rectangle upon clicking the button "Repaint" 
    { 
     public void paintComponent(Graphics g) 
     { 
      g.setColor(Color.WHITE); // Removes previous rectangle 
      g.fillRect(0,0, this.getWidth(),this.getHeight()); 

      g.setColor(randColor()); // Puts a new rectangle on screen, rand size and color 
      int height = (int)(Math.random() * this.getHeight()); 
      int width = (int)(Math.random() * this.getHeight()); 
      int x = (int)(Math.random() * 20); 
      int y = (int)(Math.random() * 20); 
      g.fillRect(x,y, height,width); 
     } 
     public Color randColor() 
     { 
      int r = (int)(Math.random() * 255); 
      int g = (int)(Math.random() * 255); 
      int b = (int)(Math.random() * 255); 
      return new Color(r, g, b); 
     } 
    } 
} 

我遇到的問題是,雖然我明確setSize()DrawPanel對象(panelEastDrawPanelCenter)50 × 50,當我運行程序它(DrawPanel)仍然是一個小面板下一個到按鈕,panelEast(容器爲DrawPanel和按鈕)仍然是相同的寬度(並且永遠不會變寬)。我意識到,我可以說

frame.pack(); 
frame.setSize(frame.getWidth(), 500); 

如果我設置東部面板爲使用BorderLayoutBoxLayout的佈局,這將使DrawPanel顯示更大。

  1. 但我不明白爲什麼設置DrawPanel對象的大小實際上並沒有改變它的大小,也不管爲什麼它仍然是我的小做setSize(50,50);
  2. 我該如何獲得中間面板停止調整大小等等巨大的,所以東面板可以調整到更寬?或者我如何調整東面板?

回答

8

BorderLayout尊重其西部和東部組件的首選寬度。它尊重其中心組件的首選寬度和高度。因此,您的DrawPanel應該覆蓋getPreferredSize()並返回適當的首選大小。

由於它位於也具有南分量的BorderLayout的中心,因此東面板的首選寬度將是繪圖面板和按鈕的首選寬度的最大值。

+0

哈哈!先生,你是一個天才。謝謝。 –

+1

我覺得這很有效,但不是最合適的方式去做。爲什麼不只是調用'setPreferredSize(Dimension d)'而不是重寫'getPreferredSize()'? : - \。 –

+0

@ Zyychin我在api中找不到這個方法(我在'Component'下查看),當我嘗試在我的代碼中使用它時,它說「沒有找到適合setPreferredSize(int,int)的方法'」 –

2

您是否嘗試過使用panel.setPerferredSize(Dimension size);

2

嘗試setPreferredSize(Dimension)方法,而不是setSize(int, int)並呼籲後,一個pack()