由于IM初学者,我不想涉足与布局管理器,我是简单地增加一个JPanel到我的主要的JFrame,并在面板中的每个组件给spesific位置。 但不知何故,则输出方式太错了..
frame = new JFrame(email + " (Offline)");
frame.setSize(400, 400);
frame.setLocation(0, 0);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setLayout(new FlowLayout());
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
// out.println("BYE");
// out.flush();
frame.dispose();
thread.stop();
}
});
panel = new JPanel();
frame.add(panel);
chat = new JTextArea();
chat.setSize(400, 200);
chat.setLocation(0, 0);
chat.setEditable(false);
panel.add(chat);
panel.validate();
JLabel you = new JLabel("You:");
you.setSize(you.getPreferredSize());
you.setLocation(0, 210);
panel.add(you);
panel.validate();
input = new JTextArea();
input.setSize(200, 200);
input.setLocation(0, 220 + chat.getSize().height);
panel.add(input);
panel.validate();
send = new JButton("Send");
send.setSize(send.getPreferredSize());
send.setLocation(210, 220 + chat.getSize().height);
panel.add(send);
panel.validate();
frame.setVisible(true);
这个框架的结果是,文本区域是看不见的,一个你:标签中间和旁边的按钮,右边..我失去的是什么?
再次,因为它使更新和维护您的GUI比它应该是更加困难,如果你打算让他们在多个平台上运行可能会导致难看的GUI的不要使用空布局。 代替
- 使用几个JPanels,每一个夹持元件的核心小组,并分别使用其最好的布局管理器
- 鸟巢这些JPanels其他JPanels使用最好的布局管理器来显示它们
- 而这将让你的GUI是没有必要的额外的代码调整大小。
- 把你的JTextAreas在JScrollPanes,这样你可以看到所有文字,即使它超越了文本区域。
- 请勿将JTextArea中的大小,不会允许它滚动。 相反,设置它的行和列。
作为一个非常简单的例子,运行这个,看看我的意思是:
import java.awt.*;
import javax.swing.*;
public class FooSwing2 {
public static void main(String[] args) {
JTextArea chatArea = new JTextArea(8, 40);
chatArea.setEditable(false);
chatArea.setFocusable(false);
JScrollPane chatScroll = new JScrollPane(chatArea);
JPanel chatPanel = new JPanel(new BorderLayout());
chatPanel.add(new JLabel("Chat:", SwingConstants.LEFT), BorderLayout.PAGE_START);
chatPanel.add(chatScroll);
JTextField inputField = new JTextField(40);
JButton sendBtn = new JButton("Send");
JPanel inputPanel = new JPanel();
inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.LINE_AXIS));
inputPanel.add(inputField);
inputPanel.add(sendBtn);
JPanel youLabelPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
youLabelPanel.add(new JLabel("You:"));
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
mainPanel.add(chatPanel);
mainPanel.add(Box.createVerticalStrut(10));
mainPanel.add(youLabelPanel);
mainPanel.add(inputPanel);
JFrame frame = new JFrame("Foo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
这将导致看上去像这样一个简单的(非功能)GUI:
现在,假设你要改变这一点,添加另一个按钮,一个“退出”的JButton到发送的JButton的权利。 如果您使用空布局,你必须调整你的图形用户界面,你就必须到左边移动的发送按钮,并确保你的数学是没有错误,等等。如果你使用的布局管理器,你需要只是两个代码新线(以改变显示,当然不是的功能):
JTextField inputField = new JTextField(40);
JButton sendBtn = new JButton("Send");
JButton exitBtn = new JButton("Exit"); // ***** added
JPanel inputPanel = new JPanel();
inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.LINE_AXIS));
inputPanel.add(inputField);
inputPanel.add(sendBtn);
inputPanel.add(exitBtn); // ***** added
就是这样,这将显示: