JTextField positioning/layout 个问题
JTextField positioning/layout issues
我一直在为我目前正在开发的桌面应用程序开发一个对话框 window。该对话框必须具有预先指定数量的文本字段(换句话说是可变的),但是我在编写代码的初始化部分时遇到了一个奇怪的错误:初始化 JTextField 组件时,最后一个决定占用整个window。我已经尝试了很多奇怪的方法来改变它添加到 window 的方式,但无论如何它都会继续这样做(顺便说一句,我将默认文本设置为字段的索引,这样我就知道它总是最后一个)。这是代码:
package com.main;
import java.awt.EventQueue;
import java.awt.TextField;
import javax.swing.JFrame;
public class classAddingDialog extends startingMenuWindow {
private JFrame frame1;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
classAddingDialog window = new classAddingDialog();
window.frame1.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public classAddingDialog() {
initialize();
}
private void initialize() {
frame1 = new JFrame();
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int count = 18,i; //startingMenuWindow.countForNewClass;
frame1.setBounds(100, 100, 450, 20+50*count/2+50);
TextField[] nameInputs=new TextField[count];
for(i=0;i<count;i++) {
nameInputs[i]=new TextField();
if(i<Math.ceil((double) count/2)) {
nameInputs[i].setBounds(10, 10+50*i, 100, 30);
}else {
nameInputs[i].setBounds(180, (int) (10+50*(i-Math.ceil((double) count/2))), 100, 30);
}
nameInputs[i].setText(Integer.toString(i));
frame1.add(nameInputs[i]);
}
}
}
也不要花力气去检查最后一个 JTextField 的位置和边界,我已经这样做了
nameInputs[i].getBounds();
功能returns正确的位置(应该在的位置),但实际上它只是覆盖了整个Window。
如果有人知道问题出在哪里,请告诉我。提前致谢。
When the JTextField components are initialized the last one decides to take up the whole window.
Swing 使用布局管理器。 JFrame 的内容窗格的默认布局管理器是 BorderLayout。当您不指定约束时,组件将添加到框架的 BorderLayout.CENTER 中。只能将一个组件添加到 CENTER,这是您添加的最后一个组件。 BorderLayout 的规则然后声明 CENTER 中的组件占据框架中所有剩余的 space。
阅读有关 Layout Manager 的 Swing 教程部分,了解更多信息和使用 BorderLayout 的示例。
解决方案是不要尝试设置组件的边界,而是使用布局管理器。
- 不要使用 TextField,它是一个 AWT 组件。你应该使用
JTextField
- 创建 JTextField 时使用类似
new JTextField(10)
的内容。 10 将指定一次可以在文本字段中显示的 "W" 个字符数。这允许文本字段计算其首选大小,然后供布局管理器使用。
- 不要尝试指定文本字段的边界。 Swing 被设计为与布局管理器一起使用。布局管理器会根据布局管理器的规则来决定组件的大小和位置。
- 在我看来,您正试图在两列网格中显示文本字段,因此您可以使用带有
GridLayout
的面板。有关示例,请参阅教程。
所以你的基本逻辑应该是这样的:
JPanel grid = new JPanel( new GridLayout(0, 2) );
for(i = 0; i < count; i++)
{
JTextField textField = new JTextField(10);
textField.setText( Integer.toString(i) );
nameInputs[i] = textField();
grid.add( textField ):
}
frame.add(grid);
frame.pack();
frame.setVisible( true );
我一直在为我目前正在开发的桌面应用程序开发一个对话框 window。该对话框必须具有预先指定数量的文本字段(换句话说是可变的),但是我在编写代码的初始化部分时遇到了一个奇怪的错误:初始化 JTextField 组件时,最后一个决定占用整个window。我已经尝试了很多奇怪的方法来改变它添加到 window 的方式,但无论如何它都会继续这样做(顺便说一句,我将默认文本设置为字段的索引,这样我就知道它总是最后一个)。这是代码:
package com.main;
import java.awt.EventQueue;
import java.awt.TextField;
import javax.swing.JFrame;
public class classAddingDialog extends startingMenuWindow {
private JFrame frame1;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
classAddingDialog window = new classAddingDialog();
window.frame1.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public classAddingDialog() {
initialize();
}
private void initialize() {
frame1 = new JFrame();
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int count = 18,i; //startingMenuWindow.countForNewClass;
frame1.setBounds(100, 100, 450, 20+50*count/2+50);
TextField[] nameInputs=new TextField[count];
for(i=0;i<count;i++) {
nameInputs[i]=new TextField();
if(i<Math.ceil((double) count/2)) {
nameInputs[i].setBounds(10, 10+50*i, 100, 30);
}else {
nameInputs[i].setBounds(180, (int) (10+50*(i-Math.ceil((double) count/2))), 100, 30);
}
nameInputs[i].setText(Integer.toString(i));
frame1.add(nameInputs[i]);
}
}
}
也不要花力气去检查最后一个 JTextField 的位置和边界,我已经这样做了
nameInputs[i].getBounds();
功能returns正确的位置(应该在的位置),但实际上它只是覆盖了整个Window。
如果有人知道问题出在哪里,请告诉我。提前致谢。
When the JTextField components are initialized the last one decides to take up the whole window.
Swing 使用布局管理器。 JFrame 的内容窗格的默认布局管理器是 BorderLayout。当您不指定约束时,组件将添加到框架的 BorderLayout.CENTER 中。只能将一个组件添加到 CENTER,这是您添加的最后一个组件。 BorderLayout 的规则然后声明 CENTER 中的组件占据框架中所有剩余的 space。
阅读有关 Layout Manager 的 Swing 教程部分,了解更多信息和使用 BorderLayout 的示例。
解决方案是不要尝试设置组件的边界,而是使用布局管理器。
- 不要使用 TextField,它是一个 AWT 组件。你应该使用
JTextField
- 创建 JTextField 时使用类似
new JTextField(10)
的内容。 10 将指定一次可以在文本字段中显示的 "W" 个字符数。这允许文本字段计算其首选大小,然后供布局管理器使用。 - 不要尝试指定文本字段的边界。 Swing 被设计为与布局管理器一起使用。布局管理器会根据布局管理器的规则来决定组件的大小和位置。
- 在我看来,您正试图在两列网格中显示文本字段,因此您可以使用带有
GridLayout
的面板。有关示例,请参阅教程。
所以你的基本逻辑应该是这样的:
JPanel grid = new JPanel( new GridLayout(0, 2) );
for(i = 0; i < count; i++)
{
JTextField textField = new JTextField(10);
textField.setText( Integer.toString(i) );
nameInputs[i] = textField();
grid.add( textField ):
}
frame.add(grid);
frame.pack();
frame.setVisible( true );