7

如何将组件放置在特定位置的布局中。就像我想在第一行放置 2 个文本框,在 3 个组合框下方。

但是当我试图把它们都出现在一行中时,我使用了 flowlayout。我也使用了边框。当我调整大小时,组件的窗口大小会超出边框。

你能建议我一些使用的布局以及如何使用它吗?

这是我的代码:

topPanel=new JPanel();
topPanel.setLayout(new FlowLayout());
topPanel.setBorder(new TitledBorder(new EtchedBorder(), "Customer Data"));

CNameTextField = new JTextField (20); // create the Customer Name text field
CNameTextField.setEditable(true);     // set editable text box

CIDLabel=new JLabel("Customer ID");

C_IDTextField = new JTextField (10);
C_IDTextField.setEditable(true);      // set editable text box

topPanel.add(CNameTextField);
topPanel.add(C_IDTextField);   

// Create and populate Room type combo box
roomTypeCombo = new JComboBox();
roomTypeCombo.addItem( "Budget($50)" );    

// Create and populate Meal type combo box
mealCombo = new JComboBox();
mealCombo.addItem( "None" );       

// Create and populate Days combo box

daysCombo = new JComboBox();

for(int i=0;i<31 ; i++) {
            // populate combobox with days
    daysCombo.addItem(i); 
}
    // Adding  rest of the components to top panel
topPanel.add(roomTypeCombo);
topPanel.add(mealCombo);
topPanel.add(daysCombo);

谢谢。

4

2 回答 2

8

最具体的布局类型是绝对定位。

警告:绝对定位应该很少使用,如果有的话。有很多原因。这是一个:绝对定位(无布局管理器)与 MiGlayout 中的绝对定位

- 感谢用户brimborium添加警告的好主意。

话虽如此,这里是如何使用绝对定位:

在上面的代码中,不是将topPanel布局设置为,而是FlowLayout将其设置为null.

topPanel.setLayout(null);

稍后在代码中,在您开始添加组件之前topPanel,调用容器的setBounds方法:

someJComponent.setBounds(x-coord, y-coord, width, height);

所以例如你创建了一个实例JComboBox()并命名它roomTypeCombo,下面的代码展示了如何绝对定位roomTypeCombo

topPanel.setLayout(null);

// code...

roomTypeCombo = new JComboBox();

// code...

roomTypeCombo.setBounds(100, 100, 200, 50);
topPanel.add(roomTypeCombo);

上面使用的setBounds方法有四个参数:

  • int x-coord- 设置roomTypeCombo相对于其父级的 x 坐标,topPanel.
  • int y-coord- 设置roomTypeComboy 相对于其父级的 y 坐标,topPanel.
  • int width- 指定roomTypeCombo的宽度。
  • int height- 指定roomTypeCombo的高度。


我只想玩弄坐标,看看你是否喜欢它产生的任何东西。可能发生的最糟糕的事情是您重新使用布局,这可能比绝对定位更好。或者您可以实现自己的布局管理器,如果您遵循此超链接,第一个答案将讨论实现您自己的布局管理器并具有有用的链接。

有关绝对定位的更多信息

于 2012-04-04T17:52:02.497 回答
6

尝试改变布局。 http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

您可以GridLayout使用两行(例如,还有其他一些可能的组合),每行分别包含 3 个 JComboBox 和两个 JTextField。

仔细查看文档并查看一些可在网络上轻松访问的示例。

import java.awt.GridLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class SwingResizeJFrame {

    public SwingResizeJFrame() {
        JTextField TextField1 = new JTextField("firstTextField");
        JTextField TextField2 = new JTextField("secondTextField");
        JPanel firstPanel = new JPanel();
        firstPanel.setLayout(new GridLayout(0, 2, 10, 10));
        firstPanel.add(TextField1);
        firstPanel.add(TextField2);

        JComboBox comboBox1 = new JComboBox(new Object[]{"Ester", "Jordi", "Jordina", "Jorge", "Sergi"});
        JComboBox comboBox2 = new JComboBox(new Object[]{"Ester", "Jordi", "Jordina", "Jorge", "Sergi"});
        JComboBox comboBox3 = new JComboBox(new Object[]{"Ester", "Jordi", "Jordina", "Jorge", "Sergi"});
        JPanel secondPanel = new JPanel();
        secondPanel.setLayout(new GridLayout(0, 3, 10, 10));
        secondPanel.add(comboBox1);
        secondPanel.add(comboBox2);
        secondPanel.add(comboBox3);

        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(2, 1, 10, 10));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(firstPanel);
        frame.add(secondPanel);
        frame.pack();
        frame.setLocation(150, 150);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                SwingResizeJFrame demo = new SwingResizeJFrame();
            }
        });
    }
}
于 2012-04-04T16:23:13.010 回答