如何在jFrame上布局多个面板? (Java)的

需要布局

我正在制作自己的Java套接字游戏。 我的游戏画面可以全画面(在这里说“在这里画画”,但我现在正在画整个画面)。 我想添加一个带有滚动条的文本框,用于显示文本,不显示任何输入和另一个文本框以从用户获取文本输入,然后添加按钮以发送文本,以进行聊天。 但在我的问题上,我怎么开始解决这个问题呢? 我知道我需要一个布局,但有人可以帮助我吗? 这是我目前的代码(此代码此刻仅设置绘制到整个屏幕,现在需要将屏幕分割起来,如上图所示):

public class Setup extends JFrame implements Runnable{ JPanel panel; JFrame window; public Setup(Starter start, JFrame window){ window.setSize(600,500); window.setLocationRelativeTo(null); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setResizable(false); panel = new Display(start); this.window = window; } public void run(){ window.getContentPane().add(panel); window.setBackground(Color.BLACK); window.setVisible(true); } } 

“新显示(开始)” – 这扩展了jpanel,它基本上是我绘制所有图形的明智之处。

另外,我看到人们添加不同的面板,但我不能让它们大小相同。 如图所示,“这里的油漆图形”面板是最大的,依此类推。

JPanel实际上只是一个容器,你可以在其中放入不同的元素(甚至其他JPanels )。 所以在你的情况下,我会建议一个大的JPanel作为你的窗口的某种主要容器 。 您可以在主面板上分配适合您需求的Layout ( 此处是布局简介 )。

将布局设置到主面板后,您可以添加绘画面板和所需的其他JPanel(如其中包含文本的那些..)。

  JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); JPanel paintPanel = new JPanel(); JPanel textPanel = new JPanel(); mainPanel.add(paintPanel); mainPanel.add(textPanel); 

这只是一个垂直排序所有子面板 (Y轴)的示例。 因此,如果你想在mainPanel的底部(可能是一些图标或按钮)需要使用其他布局(如水平布局)组织其他东西,只需再次创建一个新的JPanel作为所有其他东西和集合的容器setLayout(new BoxLayout(mainPanel, BoxLayout.X_AXIS)

正如您将发现的那样,布局非常严格,可能很难找到面板的最佳布局。 所以不要放弃,阅读介绍(上面的链接),看看图片 – 这就是我做的:)

或者您可以使用NetBeans编写程序。 在那里你有一个非常简单的可视化编辑器(拖放)来创建各种Windows和帧。 (之后只了解代码……有时候很棘手。)

编辑

由于有很多人对这个问题感兴趣,我想提供一个完整的例子来说明如何布局JFrame以使其看起来像OP想要的那样。

该类称为MyFrame,并扩展了Swing JFrame

 public class MyFrame extends javax.swing.JFrame{ // these are the components we need. private final JSplitPane splitPane; // split the window in top and bottom private final JPanel topPanel; // container panel for the top private final JPanel bottomPanel; // container panel for the bottom private final JScrollPane scrollPane; // makes the text scrollable private final JTextArea textArea; // the text private final JPanel inputPanel; // under the text a container for all the input elements private final JTextField textField; // a textField for the text the user inputs private final JButton button; // and a "send" button public MyFrame(){ // first, lets create the containers: // the splitPane devides the window in two components (here: top and bottom) // users can then move the devider and decide how much of the top component // and how much of the bottom component they want to see. splitPane = new JSplitPane(); topPanel = new JPanel(); // our top component bottomPanel = new JPanel(); // our bottom component // in our bottom panel we want the text area and the input components scrollPane = new JScrollPane(); // this scrollPane is used to make the text area scrollable textArea = new JTextArea(); // this text area will be put inside the scrollPane // the input components will be put in a separate panel inputPanel = new JPanel(); textField = new JTextField(); // first the input field where the user can type his text button = new JButton("send"); // and a button at the right, to send the text // now lets define the default size of our window and its layout: setPreferredSize(new Dimension(400, 400)); // let's open the window with a default size of 400x400 pixels // the contentPane is the container that holds all our components getContentPane().setLayout(new GridLayout()); // the default GridLayout is like a grid with 1 column and 1 row, // we only add one element to the window itself getContentPane().add(splitPane); // due to the GridLayout, our splitPane will now fill the whole window // let's configure our splitPane: splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT); // we want it to split the window verticaly splitPane.setDividerLocation(200); // the initial position of the divider is 200 (our window is 400 pixels high) splitPane.setTopComponent(topPanel); // at the top we want our "topPanel" splitPane.setBottomComponent(bottomPanel); // and at the bottom we want our "bottomPanel" // our topPanel doesn't need anymore for this example. Whatever you want it to contain, you can add it here bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.Y_AXIS)); // BoxLayout.Y_AXIS will arrange the content vertically bottomPanel.add(scrollPane); // first we add the scrollPane to the bottomPanel, so it is at the top scrollPane.setViewportView(textArea); // the scrollPane should make the textArea scrollable, so we define the viewport bottomPanel.add(inputPanel); // then we add the inputPanel to the bottomPanel, so it under the scrollPane / textArea // let's set the maximum size of the inputPanel, so it doesn't get too big when the user resizes the window inputPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 75)); // we set the max height to 75 and the max width to (almost) unlimited inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.X_AXIS)); // X_Axis will arrange the content horizontally inputPanel.add(textField); // left will be the textField inputPanel.add(button); // and right the "send" button pack(); // calling pack() at the end, will ensure that every layout and size we just defined gets applied before the stuff becomes visible } public static void main(String args[]){ EventQueue.invokeLater(new Runnable(){ @Override public void run(){ new MyFrame().setVisible(true); } }); } } 

请注意,这只是一个示例,布局窗口有多种方法。 这一切都取决于您的需求,以及您是否希望内容可以resize/响应。 另一个非常好的方法是GridBagLayout ,它可以处理相当复杂的布局,但是学习起来也很复杂。

您将需要使用许多布局管理器来帮助您获得所需的基本结果。

查看布局管理器的可视指南以进行比较。

您可以使用GridBagLayout但这是JDK中最复杂(和function最强大)的布局​​管理器之一。

您可以使用一系列复合布局管理器。

我将图形组件和文本区域放在单个JPanel ,使用BorderLayout ,图形组件位于CENTER ,文本区域位于SOUTH位置。

我使用GridBagLayout将文本字段和按钮放在单独的JPanel (因为它是我能想到的最简单的实现你想要的结果)

我将这两个面板放在第三个主面板上,使用BorderLayout ,第一个面板在CENTER ,第二个面板在SOUTH位置。

但那就是我