Java 摆动:对准问题
我有一个关于布置一些swing组件的问题 比如说,我有一个JPanel,它包含一个JLabel和一个JTextField。我希望JLabel绘制在JPanel的最左侧,JTextField绘制在JPanel的最右侧。我试着使用BoxLayout和水平胶水,但我无法让它工作。有人能解释一下应该怎么做吗?顺便说一下,我还应该能够设置JTextField的大小,它将从右向左增长 编辑:这是我的课,很简单Java 摆动:对准问题,java,swing,layout,Java,Swing,Layout,我有一个关于布置一些swing组件的问题 比如说,我有一个JPanel,它包含一个JLabel和一个JTextField。我希望JLabel绘制在JPanel的最左侧,JTextField绘制在JPanel的最右侧。我试着使用BoxLayout和水平胶水,但我无法让它工作。有人能解释一下应该怎么做吗?顺便说一下,我还应该能够设置JTextField的大小,它将从右向左增长 编辑:这是我的课,很简单 public class TextField extends JPanel { priva
public class TextField extends JPanel {
private JLabel label;
private JTextField textField;
public TextField(String labelText){
this.label = new JLabel(labelText);
this.textField = new JTextField("");
Box horizontalBox = Box.createHorizontalBox();
horizontalBox.add(label);
horizontalBox.add(Box.createHorizontalGlue());
horizontalBox.add(textField);
add(horizontalBox);
}
}
要使用BoxLayout,请执行以下操作:
public TextField(String labelText){
this.label = new JLabel(labelText);
this.textField = new JTextField("");
this.setLayout( new BoxLayout( this, BoxLayout.X_AXIS ) );
this.add( label );
this.add( Box.createHorizontalGlue() );
this.add( textField );
}
我喜欢使用复杂布局的面板,或者应该“填充”面板部分的组件
JPanel panel = new JPanel();
JLabel label = new JLabel( "Enter your text:" );
JTextField textField = new JTextField();
panel.setLayout( new GridBagLayout() );
panel.add( label,
new GridBagConstraints( 0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.EAST, GridBagConstraints.NONE,
new Insets( 0, 0, 0, 0 ), 0, 0 ) );
panel.add( textField,
new GridBagConstraints( 1, 0, 1, 1, 1.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
new Insets( 0, 0, 0, 0 ), 0, 0 ) );
您可以找到一个关于如何使用GridBagLayout的很好的解释
我试着使用BoxLayout和
水平胶水,但我做不到
它起作用了。谁能解释一下这是怎么回事
应该怎么做
这是没有诀窍的。请阅读上的Swing教程以获取一个工作示例
如果仍然不起作用,那么您需要发布您的,因为我们无法猜测您可能做错了什么。您还可以使用BorderLayout.WEST选项添加标签,并使用BorderLayout.EAST选项添加文本字段。调试swing UI的最佳方法之一是将可见边框添加到组件中更好地了解正在发生的事情 在创建
水平框后,尝试添加以下内容:
horizontalBox.setBorder(BorderFactory.createLineBorder(Color.black));
您很可能会发现,TextField
缩小到显示传递给构造函数的任何文本所需的绝对最小大小,以及JTextField的最小大小(基本上只有一个可见字符空间)
现在尝试将其添加到构造函数:
horizontalBox.setPreferredSize(new Dimension(400, 40));
然后尝试用支柱更换胶水:
horizontalBox.add(Box.createHorizontalStrut(30));
也就是说,我认为最大的问题是您使用的是JPanel,然后向其中添加了一个box组件,这使得组件的大小调整有问题
试试这个,看看它是否适合你:
public TextField(String labelText){
this.label = new JLabel(labelText);
this.textField = new JTextField("");
this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
this.setBorder(BorderFactory.createLineBorder(Color.black)); // debug
this.add(label);
this.add(Box.createHorizontalStrut(30));
this.add(textField);
}
[p.s.]
您真的想重新考虑JPanel扩展的名称。也许TextFieldDisplay或TextFieldPanel更合适。您发布的代码的问题不在于BoxLayout,而在于包含它的布局。默认情况下,JPanel使用FlowLayout。将组件添加到FlowLayout时,它不会展开以填充所有可用空间
因此,与其向面板添加框,不如将类扩展为框,或者将面板布局设置为BoxLayout并直接添加组件。将JPanel设置为使用BorderLayout。这个,再加上盒子,几乎可以给你们任何你们需要的布局。我刚刚添加了我的类,所以你们可以查看它。不,我们不能查看它。代码不可编译或不可执行。根据定义,当你遇到问题时,你不知道是什么或不是问题的原因,因此你不知道你是否发布了相关代码。谢谢大家的回答,问题已经解决了,我决定使用BorderLayout而不是BoxLayout。我对没有发布可编译或可执行代码表示歉意。