我正在为大学开发一个 Java 项目,其中涉及设置 TCP 服务器和客户端。我已经完成了该部分的工作,现在为了给我的项目添加更多感觉,我想添加一个 GUI。
我们还没有开始学习 Java 中的 GUI。不过我想尝试一下,因为我认为这将是一个有用的练习。我设置了一个非常基本的 GUI,并为按钮设置了适当的 ActionListener。我的下一个问题是定位我的面板,使它们在框架上看起来整洁......
目前我将所有组件都放在一个面板中,如下所示:
public ClientGUI(){
//Initialise Frame
frame = new JFrame("TCP Client");
//Initialise Panel 1 & Components
p1 = new JPanel();
//Set Layout
p1.setLayout(new GridLayout(1,2));
//Label 1 - For TextArea
l1 = new JLabel("Chat Log");
p1.add(l1);
//TextArea - To display conversation
t1 = new JTextArea(10,10);
p1.add(t1);
//Label 2 - For TextField
l2 = new JLabel("Message");
p1.add(l2);
//Message Box - For user input
t2 = new JTextField(10);
p1.add(t2);
//Button 1 - To send message
b1 = new JButton("Send");
p1.add(b1);
//Add panels to frame
frame.add(p1);
//Frame properties...
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400,400);
frame.setVisible(true);
//Add Event listener to button
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ev){
//do something
t1.setText(t2.getText());
}
});
我希望它看起来像下面的粗略线框。
如果有人提供任何反馈,我将不胜感激!非常感谢。
您想要的称为 BoxLayout,它以列或行的形式提供 UI 元素。 然后你可以将它们嵌套在一起,例如将一个水平框布局面板作为另一个垂直框布局面板中的元素(有点像嵌套的 HTML 表格)。 因此,所有元素都将进入顶级垂直 BoxLayout,并且具有 JLabel2 和 JTextField 的行将是其自己的水平 BoxLayout,嵌套在顶级垂直布局中。 Here是一个关于布局管理器的相当不错的教程,它包括 BoxLayout。
有很多不同的方法,也有很多不同的
LayoutManager
可以使用。
在这里阅读更多关于它们的信息:
GridBagLayout
:
//necessary imports
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
public class Test {
/**
* Default constructor for Test.class
*/
public Test() {
initComponents();
}
public static void main(String[] args) {
/**
* Set look and feel of app
*/
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
// If Nimbus is not available, you can set the GUI to another look and feel.
}
/**
* Create GUI and components on Event-Dispatch-Thread
*/
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Test test = new Test();
}
});
}
/**
* Initialize GUI and components (including ActionListeners etc)
*/
private void initComponents() {
JFrame jFrame = new JFrame("Chat Test");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setResizable(false);
//Initialise Panel 1 & Components
JPanel p1 = new JPanel(new GridBagLayout());
JPanel p2 = new JPanel(new GridBagLayout());
//Label 1 - For TextArea
JLabel l1 = new JLabel("Chat Log");
//TextArea - To display conversation
final JTextArea t1 = new JTextArea(10, 10);
JScrollPane pane = new JScrollPane(t1);
//Label 2 - For TextField
JLabel l2 = new JLabel("Message");
//Message Box - For user input
final JTextField t2 = new JTextField(10);
//Button 1 - To send message
JButton b1 = new JButton("Send");
GridBagConstraints gc = new GridBagConstraints();
gc.fill = GridBagConstraints.HORIZONTAL;
gc.weightx = 1;
gc.gridx = 0;
gc.gridy = 0;
p1.add(l1, gc);
gc.gridx = 0;
gc.gridy = 1;
p1.add(pane, gc);
GridBagConstraints gc2 = new GridBagConstraints();
gc2.fill = GridBagConstraints.HORIZONTAL;
gc2.weightx = 1;
gc2.gridx = 0;
gc2.gridy = 0;
gc2.ipadx = 10;
p2.add(l2, gc2);
gc2.gridx = 1;
gc2.gridy = 0;
p2.add(t2, gc2);
gc2.gridx = 1;
gc2.gridy = 1;
p2.add(b1, gc2);
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ev) {
//do something
t1.setText(t2.getText());
}
});
jFrame.add(p1, BorderLayout.CENTER);
jFrame.add(p2, BorderLayout.SOUTH);
//pack frame (size JFrame to match preferred sizes of added components and set visible
jFrame.pack();
jFrame.setVisible(true);
}
}