BorderLayout 的 Swing GUI 问题
Swing GUI problems with BorderLayout
我目前正在尝试使用布局,考虑到我从来没有真正理解它们,只是做了 nullLayout,然后绝对定位所有元素。
不过,我目前有一个合适的小项目,正在努力学习,就是一些小的聊天服务。
这是一张现在的照片:
这是一张图片,展示了我想象中的完成方式(请注意,这只是一些概念,但它应该给你正确的想法。我不是图形艺术家):
这是我当前的代码:
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 的理解,是将文本字段(稍后聊天对话框所在的位置)放在框架内的西侧。
要发送的按钮和用于输入一些文本的字段将位于面板内,具有自己的边框布局,而按钮右侧有一些较小的部分,其余宽度由文本字段填充。
然后整个面板在框架的南侧结束。
但是,现在我遇到了问题,元素不断缩小到尽可能小的尺寸。
我试图用 setSize() 解决这个问题; ,但这根本没有影响,它只是被完全忽略了。
任何帮助我指明正确方向的方法?
尝试 BoxLayout
在 messagePanel
中安装 BorderLayout
:
messagePanel.setLayout(new BoxLayout(messagePanel,BoxLayout.LINE_AXIS));
messagePanel.add(chatMessage);
messagePanel.add(send);
对于textField
:
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
正如 Sridhar 所指出的,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);
}
它会起作用..
最初,您遇到了一个简单的问题:
// should be new JPanel(new BorderLayout())
JPanel messagePanel = new JPanel();
然后,之后,一般BorderLayout都喜欢在BorderLayout.CENTER
中拉伸组件。所以你想把你的 textfield
和 chatMessage
放在中间。
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 的大小包括,例如,标题栏。
- 您应该考虑将
JTextArea
包装在滚动窗格中。然后你可以 setPreferredSize
on the viewport.
- 获得具有首选大小的组件后,在调用
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);
我目前正在尝试使用布局,考虑到我从来没有真正理解它们,只是做了 nullLayout,然后绝对定位所有元素。
不过,我目前有一个合适的小项目,正在努力学习,就是一些小的聊天服务。
这是一张现在的照片:
这是一张图片,展示了我想象中的完成方式(请注意,这只是一些概念,但它应该给你正确的想法。我不是图形艺术家):
这是我当前的代码:
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 的理解,是将文本字段(稍后聊天对话框所在的位置)放在框架内的西侧。
要发送的按钮和用于输入一些文本的字段将位于面板内,具有自己的边框布局,而按钮右侧有一些较小的部分,其余宽度由文本字段填充。
然后整个面板在框架的南侧结束。
但是,现在我遇到了问题,元素不断缩小到尽可能小的尺寸。
我试图用 setSize() 解决这个问题; ,但这根本没有影响,它只是被完全忽略了。
任何帮助我指明正确方向的方法?
尝试 BoxLayout
在 messagePanel
中安装 BorderLayout
:
messagePanel.setLayout(new BoxLayout(messagePanel,BoxLayout.LINE_AXIS));
messagePanel.add(chatMessage);
messagePanel.add(send);
对于textField
:
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
正如 Sridhar 所指出的,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);
}
它会起作用..
最初,您遇到了一个简单的问题:
// should be new JPanel(new BorderLayout())
JPanel messagePanel = new JPanel();
然后,之后,一般BorderLayout都喜欢在BorderLayout.CENTER
中拉伸组件。所以你想把你的 textfield
和 chatMessage
放在中间。
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 的大小包括,例如,标题栏。 - 您应该考虑将
JTextArea
包装在滚动窗格中。然后你可以setPreferredSize
on the viewport. - 获得具有首选大小的组件后,在调用
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);