Java 带边框布局的Swing GUI问题
考虑到我从来没有真正理解过布局,而是只做了nullLayout,绝对定位了所有元素,我目前正在尝试与布局相处 然而,我目前有一个合适的小项目,我正在尝试学习它,这是一些小型聊天服务 下面是一张照片: 这是一张图片,我想象它是如何完成的(请注意,这只是一个概念,但它应该给你一个正确的想法。我不是一个平面艺术家): 这是我目前的代码:Java 带边框布局的Swing GUI问题,java,swing,border-layout,Java,Swing,Border Layout,考虑到我从来没有真正理解过布局,而是只做了nullLayout,绝对定位了所有元素,我目前正在尝试与布局相处 然而,我目前有一个合适的小项目,我正在尝试学习它,这是一些小型聊天服务 下面是一张照片: 这是一张图片,我想象它是如何完成的(请注意,这只是一个概念,但它应该给你一个正确的想法。我不是一个平面艺术家): 这是我目前的代码: public class Gui { JFrame frame; JTextArea textfield; JTextField enterMessage;
public class Gui {
JFrame frame;
JTextArea textfield;
JTextField enterMessage;
public Gui(){
frame = new JFrame();
frame.setSize(600, 400);
textfield = new JTextArea();
textfield.setText("Textfield");
textfield.setSize(400, 300);
JPanel messagePanel = new JPanel();
JTextField chatMessage = new JTextField();
chatMessage.setText("Send me");
JButton send = new JButton();
send.setText("Send");
messagePanel.add(chatMessage, BorderLayout.WEST);
messagePanel.add(send, BorderLayout.EAST);
frame.add(textfield, BorderLayout.WEST);
frame.add(messagePanel, BorderLayout.SOUTH);
frame.setVisible(true);
}
}
我的想法,加上到目前为止对BorderLayouts的理解,是把Textfield(聊天对话框稍后出现的地方)放在框架的西侧
要发送的按钮和要输入某些文本的字段将位于一个面板内,具有自己的边框布局,而按钮的右侧有一些较小的部分,其余宽度将由文本字段填充
然后,整个面板在框架的南侧结束
然而,现在我有一个问题,元素一直缩小到最小可能的大小
我试图用setSize()来解决这个问题,但这根本没有影响,只是被完全忽视了
有什么可以帮我指出正确方向的吗?请尝试
消息面板中的框布局安装边框布局:
messagePanel.setLayout(new BoxLayout(messagePanel,BoxLayout.LINE_AXIS));
messagePanel.add(chatMessage);
messagePanel.add(send);
对于文本字段
:
frame.add(textfield, BorderLayout.CENTER);
在messagePanel
中尝试安装BoxLayout
:
messagePanel.setLayout(new BoxLayout(messagePanel,BoxLayout.LINE_AXIS));
messagePanel.add(chatMessage);
messagePanel.add(send);
对于文本字段
:
frame.add(textfield, BorderLayout.CENTER);
尝试设置元素的首选尺寸
textfield.setText("Textfield");
textfield.setPreferredSize(new Dimension(600, 300));
//some other code
JTextField chatMessage = new JTextField();
chatMessage.setPreferredSize(new Dimension(500, 25));
//some other code
尝试设置元素的首选尺寸
textfield.setText("Textfield");
textfield.setPreferredSize(new Dimension(600, 300));
//some other code
JTextField chatMessage = new JTextField();
chatMessage.setPreferredSize(new Dimension(500, 25));
//some other code
正如所指出的,BorderLayout
并不总是考虑子面板的尺寸。要解决此问题,您应该使用setPreferedSize()
初始化子面板(在本例中为textfield
和messagePanel
),而不是setSize()
,正如所指出的,BorderLayout
并不总是考虑子面板的尺寸。要解决此问题,您应该使用setPreferedSize()
而不是setSize()
来初始化子面板(在本例中是textfield
和messagePanel
),将构造函数更改为
public Gui() {
frame = new JFrame();
frame.setSize(600, 400);
textfield = new JTextArea();
textfield.setText("Textfield");
textfield.setSize(400, 300);
// set border layout to JPanel
JPanel messagePanel = new JPanel(new BorderLayout());
JTextField chatMessage = new JTextField();
chatMessage.setText("Send me");
JButton send = new JButton();
send.setText("Send");
// add JTextField to CENTER and button to EAST
messagePanel.add(chatMessage, BorderLayout.CENTER);
messagePanel.add(send, BorderLayout.EAST);
// add textArea to CENTER of JFrame
frame.add(textfield, BorderLayout.CENTER);
frame.add(messagePanel, BorderLayout.SOUTH);
frame.setVisible(true);
}
它将工作。将构造函数更改为
public Gui() {
frame = new JFrame();
frame.setSize(600, 400);
textfield = new JTextArea();
textfield.setText("Textfield");
textfield.setSize(400, 300);
// set border layout to JPanel
JPanel messagePanel = new JPanel(new BorderLayout());
JTextField chatMessage = new JTextField();
chatMessage.setText("Send me");
JButton send = new JButton();
send.setText("Send");
// add JTextField to CENTER and button to EAST
messagePanel.add(chatMessage, BorderLayout.CENTER);
messagePanel.add(send, BorderLayout.EAST);
// add textArea to CENTER of JFrame
frame.add(textfield, BorderLayout.CENTER);
frame.add(messagePanel, BorderLayout.SOUTH);
frame.setVisible(true);
}
它会起作用的。最初,您有一个简单的问题:
// should be new JPanel(new BorderLayout())
JPanel messagePanel = new JPanel();
之后,BorderLayout通常喜欢在BorderLayout.CENTER
中拉伸组件。因此,您希望将文本字段
和聊天信息
放在中间
public Gui(){
frame = new JFrame();
frame.setSize(600, 400);
textfield = new JTextArea();
textfield.setText("Textfield");
// textfield.setSize(400, 300);
JPanel messagePanel = new JPanel(new BorderLayout());
JTextField chatMessage = new JTextField("Send me");
JButton send = new JButton("Send");
messagePanel.add(chatMessage, BorderLayout.CENTER);
messagePanel.add(send, BorderLayout.EAST);
frame.add(textfield, BorderLayout.CENTER);
frame.add(messagePanel, BorderLayout.SOUTH);
frame.setVisible(true);
}
一旦你这样做了,你应该得到这样的东西:
但是,作为几句忠告:
- 不要依赖JFrame的
setSize
。相反,您应该在单个组件上使用setPreferredSize
,整个UI应该围绕该组件进行调整。(可能是主文本区域。)JFrame的大小包括,例如,标题栏
<> LI>应考虑在滚动窗格中包装<代码> JTextArea <代码>。你可以这样做
- 获得具有首选大小的组件后,在调用
setVisible(true)
之前,在JFrame上调用pack()
。这将自动调整大小
比如:
frame = new JFrame();
// frame.setSize(600, 400);
...
JScrollPane pane = new JScrollPane(
textfield,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// specifying initial size for the
// visible portion of the scroll pane
pane.getViewport().setPreferredSize(new Dimension(320, 200));
frame.add(pane, BorderLayout.CENTER);
frame.add(messagePanel, BorderLayout.SOUTH);
// entire UI sizes around the scroll pane view
frame.pack();
frame.setVisible(true);
最初,您有一个简单的问题:
// should be new JPanel(new BorderLayout())
JPanel messagePanel = new JPanel();
之后,BorderLayout通常喜欢在BorderLayout.CENTER
中拉伸组件。因此,您希望将文本字段
和聊天信息
放在中间
public Gui(){
frame = new JFrame();
frame.setSize(600, 400);
textfield = new JTextArea();
textfield.setText("Textfield");
// textfield.setSize(400, 300);
JPanel messagePanel = new JPanel(new BorderLayout());
JTextField chatMessage = new JTextField("Send me");
JButton send = new JButton("Send");
messagePanel.add(chatMessage, BorderLayout.CENTER);
messagePanel.add(send, BorderLayout.EAST);
frame.add(textfield, BorderLayout.CENTER);
frame.add(messagePanel, BorderLayout.SOUTH);
frame.setVisible(true);
}
一旦你这样做了,你应该得到这样的东西:
但是,作为几句忠告:
- 不要依赖JFrame的
setSize
。相反,您应该在单个组件上使用setPreferredSize
,整个UI应该围绕该组件进行调整。(可能是主文本区域。)JFrame的大小包括,例如,标题栏
<> LI>应考虑在滚动窗格中包装<代码> JTextArea <代码>。你可以这样做
- 获得具有首选大小的组件后,在调用
setVisible(true)
之前,在JFrame上调用pack()
。这将自动调整大小
比如:
frame = new JFrame();
// frame.setSize(600, 400);
...
JScrollPane pane = new JScrollPane(
textfield,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// specifying initial size for the
// visible portion of the scroll pane
pane.getViewport().setPreferredSize(new Dimension(320, 200));
frame.add(pane, BorderLayout.CENTER);
frame.add(messagePanel, BorderLayout.SOUTH);
// entire UI sizes around the scroll pane view
frame.pack();
frame.setVisible(true);
尝试设置面板的首选大小,这将解决您的问题。尝试设置面板的首选大小,这将解决您的问题。非常好的建议!你能告诉我我必须用新的BorderLayout()创建JPanel对象吗?它不是已经默认了吗?不,JPanel默认为FlowLayout。您可能会想到JFrame的内容窗格,默认情况下它有一个BorderLayout,但它不同于单独创建一个JPanel。有用的提示。很棒的建议!你能告诉我我必须用新的BorderLayout()创建JPanel对象吗?它不是已经默认了吗?不,JPanel默认为FlowLayout。您可能会想到JFrame的内容窗格,默认情况下它有一个BorderLayout,但它不同于单独创建一个JPanel。有用的提示。