如何将组件放置在特定位置?
如何将组件放置在特定位置的布局中。 就像我想放置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);
感谢。
尝试更改布局。 http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html
你可以去含有两行的GridLayout
(例如,存在其他一些可能的组合),与含有3分别JComboBoxs,和两个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-04 16:37:35
最具体的布局类型是绝对定位。
警告:绝对定位应该很少使用。原因有很多。这里是一个:Absolute positioning (No layout manager) vs. absolute positioning in 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
“到它的父,topPanel
小号相对X坐标。 int y-coord
- 设置roomTypeCombo
的y坐标相对于它的父母,topPanel
。int width, int height
- 最后两个参数指定了roomTypeCombo
的宽度和高度,这很自我解释。
我只想玩的坐标,看看你喜欢什么,出来的话,可能发生的最糟糕的事情是,你回去使用布局,这可能是比绝对定位更好。或者你可以实现你自己的layout manager,如果你按照这个超链接,第一个答案会谈到实现你自己的布局管理器,并有有用的链接。
对不起,如果我写的东西无论如何帮助你。
这个问题的完美答案。我问自己为什么选择其他答案。应该有一个警告,绝对定位在大多数情况下**不是**的方式)。 – brimborium 2013-05-31 07:49:24
如果我可以使用[MigLayout(http://www.miglayout.com/)太好了这样的事情,太容易实现:-)或者你可以去[GridBagLayout的] (http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html),只是这个有时候有点难处理:-( – 2012-04-04 17:31:22