2012-11-09 101 views
3

是否可以排列擺動部件? 這些組件位於使用流佈局的獨立面板中。這兩個面板位於另一個使用網格佈局的面板中。通過邊緣排列擺動部件

image

正如你可以看到有一個微妙的差異,我覺得很討厭。我知道所有的jlabel [藍色/紫色矩形都具有相同的大小,所以我認爲這可能是因爲'+'和'*',但我不確定,因爲第一個的左側兩個箱子沒有排隊。

面板

JPanel panel2 = new JPanel(new GridLayout(4, 1)); 
JPanel panel2a = new JPanel(new FlowLayout()); 
JPanel panel2b = new JPanel(new FlowLayout()); 

第一兩個矩形(紫色)

add1 = new JLabel("", JLabel.CENTER); 
add1.setTransferHandler(new TransferHandler("text")); 
add1.setBorder(b2); 
add2 = new JLabel("", JLabel.CENTER); 
add2.setTransferHandler(new TransferHandler("text")); 
add2.setBorder(b2); 

兩個藍色矩形

textFieldA = new JTextField(); 
textFieldA.setHorizontalAlignment(JTextField.CENTER); 
textFieldA.setEditable(false); 
textFieldA.setBorder(new LineBorder(Color.blue)); 
textFieldM = new JTextField(); 
textFieldM.setHorizontalAlignment(JTextField.CENTER); 
textFieldM.setEditable(false); 
textFieldM.setBorder(new LineBorder(Color.blue)); 

+和*

opA = new JLabel("+", JLabel.CENTER); 
opS = new JLabel("*", JLabel.CENTER); 

顯示了矩形的大小相同

Dimension d = card1.getPreferredSize(); 
int width = d.width + 100; 
int height = d.height + 50; 

add1.setPreferredSize(new Dimension(width, height)); 
add2.setPreferredSize(new Dimension(width, height)); 
mult1.setPreferredSize(new Dimension(width, height)); 
mult2.setPreferredSize(new Dimension(width, height)); 

textFieldA.setPreferredSize(new Dimension(width, height)); 
textFieldM.setPreferredSize(new Dimension(width, height)); 

添加到面板

panel2a.add(add1); 
panel2a.add(opA); 
panel2a.add(add2); 
panel2a.add(enterA); 
panel2a.add(textFieldA); 
panel2c.add(mult1); 
panel2c.add(opM); 
panel2c.add(mult2); 
panel2c.add(enterM); 
panel2c.add(textFieldM); 
panel2.add(panel2a); 
panel2.add(panel2c); 
+0

與常規佈局的我不這麼認爲。 Netbeans使用佈局來對齊組件(我認爲)使用代碼非常難看。 (這是一個自定義佈局,可能會包含在最近的Java版本中) – madth3

+0

當然,請看[佈局管理器視覺指南](http://docs.oracle.com/javase/tutorial/uiswing/layout/ visual.html)。 'GridBagLayout'浮現在腦海 – MadProgrammer

+0

另請參見[我應該避免使用Java Swing中的set(Preferred | Maximum | Minimum)Size方法](http://stackoverflow.com/q/7229226/230513)? – trashgod

回答

6

AFAIU這可以實現使用GroupLayout。這種佈局需要5個水平組和2個垂直組。

GroupLayout vertical & horizontal groups

對於實施例(包括圖像的討論)參見How to Use GroupLayout

另請參閱this answer對於MCVE。

+1

我可以看到我的週末將花在閱讀'GroupLayout'上:P – MadProgrammer

+1

@MadProgrammer:For [example](http://stackoverflow.com/a/8504753/230513)。 – trashgod

6

跨容器的佈局管理是不是真的有可能(或至少我從來沒有見過一個佈局管理器就是這樣)。

你可以,但是,仔細想想你的佈局要求和使用複合組件和佈局管理器產生一些有趣的效果......

enter image description here

public class TestLayout { 

    public static void main(String[] args) { 
     new TestLayout(); 
    } 

    public TestLayout() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new GridLayout(2, 0)); 
       frame.add(new CalculatePane("+")); 
       frame.add(new CalculatePane("x")); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class CalculatePane extends JPanel { 

     public CalculatePane(String operator) { 
      setLayout(new GridBagLayout()); 
      Font font = UIManager.getFont("TextField.font").deriveFont(Font.BOLD, 24); 
      JTextField field1 = new JTextField(2); 
      JTextField field2 = new JTextField(2); 
      JTextField field3 = new JTextField(2); 
      field1.setFont(font); 
      field2.setFont(font); 
      field3.setFont(font); 

      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.insets = new Insets(2, 2, 2, 2); 
      gbc.fill = GridBagConstraints.BOTH; 
      add(field1, gbc); 
      gbc.gridx++; 
      add(new JLabel(operator), gbc); 
      gbc.gridx++; 
      add(field2, gbc); 
      gbc.gridx++; 
      gbc.fill = GridBagConstraints.HORIZONTAL; 
      add(new JButton("="), gbc); 
      gbc.fill = GridBagConstraints.BOTH; 
      gbc.gridx++; 
      add(field3, gbc); 


     } 

    } 

}