2012-06-18 27 views

回答

2

How to Use Borders所示,您可以使用空白邊框和標題邊框創建複合邊框。

附錄:或者,您可以使用邊框的getMinimumSize()方法確保標題可見。另見相關的Q&A

enter image description here

f.add(createPanel("Actuator status"), BorderLayout.WEST); 
f.add(createPanel("Indicator result"), BorderLayout.EAST); 
... 
private Box createPanel(String s) { 
    Box box = new Box(BoxLayout.Y_AXIS); 
    TitledBorder title = BorderFactory.createTitledBorder(null, s, 
     TitledBorder.CENTER, TitledBorder.DEFAULT_POSITION); 
    box.setBorder(title); 
    for (int i = 0; i < 6; i++) { 
     JButton b = new JButton(null, UIManager.getIcon("html.pendingImage")); 
     b.setAlignmentX(JButton.CENTER_ALIGNMENT); 
     box.add(b); 
    } 
    box.validate(); 
    Dimension db = box.getPreferredSize(); 
    int max = Math.max(title.getMinimumSize(box).width, db.width); 
    box.setPreferredSize(new Dimension(max, db.height)); 
    return box; 
} 
+0

感謝小費。 – Alejander

+0

更通用的解決方案是覆蓋'getPreferredSize()',如[here](http://stackoverflow.com/a/11132778/230513)所示。 – trashgod

2
  • 也許瘋狂的想法,但可能與JSeparator太:-)

  • 需要使用適當的LayoutManager,也許GridBagLayoutJComponent放置不GBC可以PreferrredSizeJComponent,但不可解除),不是GridLayout

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JSeparator; 
import javax.swing.SwingUtilities; 

public class NestedLayout { 

    private JFrame frame = new JFrame(); 
    private JPanel leftPanel = new JPanel(); 
    private JSeparator sep = new JSeparator(); 
    private JLabel label = new JLabel("<html> L<br>a<br>b<br>e<br>l<br></html>"); 

    public NestedLayout() { 
     label.setOpaque(true); 
     sep.setOrientation(JSeparator.VERTICAL); 
     sep.setLayout(new GridLayout(3, 1)); 
     sep.add(new JLabel()); 
     sep.add(label); 
     sep.add(new JLabel()); 
     leftPanel.setLayout(new BorderLayout()); 
     leftPanel.setBorder(BorderFactory.createEmptyBorder(
       10, //top 
       10, //left 
       10, //bottom 
       10)); //right 
     leftPanel.add(sep, BorderLayout.CENTER); 
     leftPanel.setPreferredSize(new Dimension(40, 220)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(leftPanel, BorderLayout.WEST); 
     //frame.add(label); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       NestedLayout nestedLayout = new NestedLayout(); 
      } 
     }); 
    } 
} 
+0

+1在頂部和底部爲零的'aqua'看起來更好。 – trashgod