2012-11-09 59 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); 


     } 

    } 

}