[英]Swing GUI problems with BorderLayout
考虑到我从未真正理解过Layouts,我目前正尝试与Layouts相处,而只做了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的理解,是将文本字段(聊天对话最后在此字段中)放置在稍后的框架中,即WEST侧。
发送按钮和输入文本的字段将在面板内,具有自己的borderlayout,而按钮的右侧部分较小,其余宽度由文本字段填充。
然后整个面板在框架的南侧结束。
但是,现在我有一个问题,即元素不断缩小到最小尺寸。
我试图用setSize()来解决这个问题; ,但这根本没有影响,只是被完全忽略了。
有什么帮助我指出正确的方向吗?
最初,您有一个简单的问题:
// 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);
}
完成此操作后,您将获得如下内容:
但是,作为几点建议:
setSize
。 相反,您应该在单个组件上使用setPreferredSize
,整个UI应该自行调整大小。 (可能是主文本区域。)JFrame的大小包括例如标题栏。 JTextArea
包装在滚动窗格中。 然后,您可以改为在视口上设置setPreferredSize
。 setVisible(true)
之前在JFrame上调用pack()
setVisible(true)
。 这将自动调整大小。 就像是:
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);
尝试在messagePanel
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
setSize()
。
将您的构造函数更改为
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);
}
它会工作..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.