2017-05-01 48 views
0

我有一個JDialog只有幾個簡單的組件,一個JTextArea,一個JtextField和一個JRadioButton。我只是希望它顯示一個合適的大小。JDialog大小不適合,爲什麼BoxLayout中不使用PreferredSize?

組件的PreferredSize看起來很合理,但是所有東西都會被截斷。我用Y_AXIS使用BoxLayout。

我不想設置明確的大小,我只是想爲那裏的組件合適的大小。

特別是,爲什麼忽略textarea的PreferredSize?

,我已經創建的最少的代碼如下: -

創建以下的輸出: -

0|Name: dialog0, Class: javax.swing.JDialog, [175, 132], H: 103, W: 132, AlignmentX: 0, AlignmentY: 0 
1|-Name: null, Class: javax.swing.JRootPane, [137, 116], H: 65, W: 116, AlignmentX: 0, AlignmentY: 0 
2|--Name: null.glassPane, Class: javax.swing.JPanel, [10, 10], H: 65, W: 116, AlignmentX: 0, AlignmentY: 0 
2|--Name: null.layeredPane, Class: javax.swing.JLayeredPane, [1, 1], H: 65, W: 116, AlignmentX: 0, AlignmentY: 0 
3|---Name: null.contentPane, Class: javax.swing.JPanel, [137, 116], H: 65, W: 116, AlignmentX: 0, AlignmentY: 0 
4|----Name: null, Class: javax.swing.JPanel, [137, 116], H: 65, W: 116, AlignmentX: 0, AlignmentY: 0 
5|-----Name: null, Class: javax.swing.JTextArea, [94, 116], H: 22, W: 116, AlignmentX: 0, AlignmentY: 0 
5|-----Name: null, Class: javax.swing.JRadioButton, [23, 57], H: 23, W: 57, AlignmentX: 0, AlignmentY: 0 
5|-----Name: null, Class: javax.swing.JTextField, [20, 6], H: 20, W: 116, AlignmentX: 0, AlignmentY: 0 

的代碼如下: -

package testing.example; 

import java.awt.Component; 
import java.awt.Container; 
import javax.swing.BoxLayout; 
import static javax.swing.BoxLayout.Y_AXIS; 
import javax.swing.ButtonGroup; 
import javax.swing.CellRendererPane; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.JViewport; 
import testing.Panel; 
import testing.testPanel; 

public class DialogSize { 

final private static String LOOKANDFEEL = "Windows"; 
private static JDialog dialog; 
private static JTextArea textArea; 
private static JTextField textField; 
private static JPanel panel; 
private static JRadioButton button; 

// <editor-fold defaultstate="collapsed" desc="initLookAndFeel"> 
private static void initLookAndFeel() { 
    if (LOOKANDFEEL != null) { 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Windows".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } 
     catch (ClassNotFoundException | 
       InstantiationException | 
       IllegalAccessException | 
       javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(BlankBorder.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
    } 
} // </editor-fold> 

private static void createAndShowDialog() { 
    initLookAndFeel(); 
    dialog = new JDialog(); 
    panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, Y_AXIS)); 
    textArea = new JTextArea(); 
    textArea.setText("Enter the dribble furble that you wish to frangle from all time."); 
    textArea.setLineWrap(true); 
    textArea.setWrapStyleWord(true); 
    button = new JRadioButton("Button"); 
    textField = new JTextField(); 
    panel.add(textArea); 
    panel.add(button); 
    panel.add(textField); 
    dialog.add(panel); 
    dialog.setVisible(true); 
    dialog.pack(); 
    analyseComponent(dialog); 
} 

public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      createAndShowDialog(); 
     } 
    }); 
} 

private static int level = 0; 
private static String indent = "|"; 

public static void analyseFrame(JFrame frame) { 
    if (frame == null) return; 
    int h = frame.getHeight(); 
    int w = frame.getWidth(); 
    Container container = frame.getContentPane(); 
    analyseComponent(frame); 
    System.out.print("\n\n"); 
} 

public static void analyseContainer(Container container) { 
    level++; 
    indent += "-"; 
    int componentCount = container.getComponentCount(); 
    Component[] components = container.getComponents(); 
    for (int i=0; i < componentCount; i++) { 
     Component component = components[i]; 
     analyseComponent(component); 
    } 
    indent = indent.replaceAll("(.*)-", "$1"); 
    level--; 
} 

public static void analyseComponent(Component component) { 
    Class componentClass = component.getClass(); 
    String className = componentClass.getName(); 
    int alignmentX = (int) component.getAlignmentX(); 
    int alignmentY = (int) component.getAlignmentY(); 
    int h = component.getHeight(); 
    int w = component.getWidth(); 
    System.out.print(level+indent+ 
      "Name: "+component.getName()+", "+ 
      "Class: "+component.getClass().getName()+", "+ 
      " ["+(int)component.getPreferredSize().getHeight() +", "+ 
      (int)component.getPreferredSize().getWidth()+"], "+ 
      "H: "+h +", "+"W: "+w+", "+ 
      "AlignmentX: "+alignmentX+", "+ 
      "AlignmentY: "+alignmentY+ 
      "\n"); 
    if (className.contains("Dialog")) { 
     analyseContainer((Container)component); 
    } 
    else if (className.contains("Pane")) { 
     analyseContainer((Container)component); 
    } 
} 

}

+1

方評論:你可能**從不**想要設置JTextArea的大小或首選大小。 JTextAreas通常位於JScrollPanes內,如果以這種方式約束它們的大小,則會破壞它們的行爲,阻止它們在需要時擴展,並阻止顯示滾動條。而是設置JTextArea的* visible *列和行屬性。 –

+0

[如何使用BoxLayout設置容器內部組件大小]的可能重複(http://stackoverflow.com/questions/18405660/how-to-set-component-size-inside-container-with-boxlayout) –

回答

0

特別是,爲什麼是t的PreferredSize extarea忽略?

好問題。我無法解釋爲什麼它被忽視。

默認優選大小計算將嘗試顯示在一行上的所有文本,但由於某些原因計算面板的優選尺寸,因此該對話框當所計算的優選的寬度不被使用。

所有我可以建議是創建GUI的一些準則:

首先執行所有的順序應該是:

dialog.pack(); 
dialog.setVisible(true); 

當你這樣做的對話框的其他方式最初將以默認大小顯示,然後當pack()完成時,它將被調整大小。您可能會看到對話框已繪製並且默認大小,然後跳轉到較大的大小。

當使用文本組件,你會希望提供其他信息,該組件,使其能夠更好地確定它的首選大小。所以,你會使用類似:

JTextArea textArea = new JTextArea(3, 20); 
JTextField textField = new JTextField(10); 

這將允許每個組件確定根據指定的列值的首選寬度。使用文本區域,行將提供用於確定高度的信息。

當您使用此方法時,文本區域和文本字段的首選大小將用於pack()計算。

而且你應該使用:

panel.add(new JScrollPane(textArea)); 

這將確保3行開始顯示。如果需要更多的線來顯示文本,然後滾動條就會出現。