2011-05-03 59 views
1

我在想,如果有一種方法,以儘可能廣泛設置一個組合框」寬度,因爲它是在JPanel中 我有下面的代碼片段:如何將Java ComboBox的寬度設置爲與它所在的JPanel一樣寬?

public newPanel() { 
     setLayout(new GridLayout(2,0)); 

     String[] example = new String[] {"one, "two", "three", "four"}; 

     JComboBox cBox = new JComboBox(levels); 
     cBox.setPreferredSize(new Dimension(300, 20)); 

     this.add(new JLabel("This is text that goes above the ComboBox:")); 
     this.add(cBox); 
    } 

你可以看到,我說我想要的組合框寬度爲300px,但是有沒有辦法將它自動​​設置爲與其所在的面板一樣寬? 類似cBox.setPreferredWidth(max); (我知道這不存在,只是爲了展示我的思維方式)。

謝謝!

回答

2

是否有一種方法可以自動將其設置爲與其所在的面板一樣寬?

您可能想要讓佈局管理器處理此問題。

如果你不要設置首選寬度,GridLayout將確保組合框水平填充整個面板。

這個片段...

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

class Test { 
    public static void main(String[] args) { 

     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(2,0)); 

     String[] example = new String[] {"one", "two", "three", "four"}; 

     JComboBox cBox = new JComboBox(example); 
     //cBox.setPreferredSize(new Dimension(300, 20)); 

     panel.add(new JLabel("This is text that goes above the ComboBox:")); 
     panel.add(cBox); 
     panel.setBorder(BorderFactory.createTitledBorder("Panel border")); 

     frame.setContentPane(panel); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

...結果

enter image description here

如果這不是你不夠靈活,我會建議你使用GridBagLayout

1

您可以使用GridBagLayout作爲佈局管理器與填充的約束水平:

this.setLayout(new GridBagLayout()); 
this.add(cBox,new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); 
1

您可以使用的BoxLayout和頂級顯示元素下做到這一點。 它會自動使用其最大尺寸

你可以看一下,如果你想更深入地瞭解: http://blogs.oracle.com/CoreJavaTechTips/entry/getting_to_know_boxlayout

class newPanel extends JPanel{ 
     public newPanel(){ 
      setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 

      String[] levels = new String[] {"one", "two", "three", "four"}; 

      JComboBox cBox = new JComboBox(levels); 
      //cBox.setPreferredSize(new Dimension(300, 20)); 

      add(new JLabel("This is text that goes above the ComboBox:")); 
      add(cBox); 
     } 
    } 
1

正如一些人已經指出的那樣,使下拉框中填入的空間被支持幾個佈局管理員。行爲由具體經理自行決定。沒有辦法知道他們在做什麼:-)然後決定你想要哪種行爲並選擇合適的行爲,而不要忘記周圍有優秀的第三方LayoutManagers。

有點猜測:您希望comboBox擴展到完整寬度,但在增加幀高度時保持其高度爲「合理」單線程。 BoxLayout可以通過代碼提供一些幫助:它確實尊重組件的最大提示,只要有提示。某些組件(如JLabel)會返回合理的內容,而其他組件(如JComboBox)則不會。

下面是一個將最大大小添加到組合框的代碼片段。

JComponent panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); 

    String[] levels = new String[] { "one", "two", "three", "four" }; 

    JComboBox cBox = new JComboBox(levels) { 

     @Override 
     public Dimension getMaximumSize() { 
      Dimension dim = super.getMaximumSize(); 
      dim.height = getPreferredSize().height; 
      return dim; 
     } 

    }; 

    panel.add(new JLabel("This is text that goes above the ComboBox:")); 
    panel.add(cBox); 
相關問題