Cod*_*ggo 15 java layout swing jpanel jframe

我正在制作自己的Java套接字游戏.我的游戏在全屏幕上绘画都很好(在这里它说"在这里绘制图形",但我现在正在绘制整个jframe).我想添加一个带滚动条的文本框,用于仅显示文本,不接受任何输入和另一个文本框以从用户接收文本输入,然后添加按钮发送文本,以进行聊天.但在我的问题上,我怎么开始说出来呢?我知道我需要一个布局,但有人可以帮我吗?这是我目前的代码(此代码此刻仅设置绘制到整个屏幕,现在需要将屏幕分割起来,如上图所示):
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);
}
}
Run Code Online (Sandbox Code Playgroud)
"new Display(start)" - 这扩展了jpanel,它基本上是我绘制所有图形的明智之处.
另外,我见过人们添加不同的面板,但我不能让它们大小相同.就像在图片中一样,"paint graphics here"面板是最大的面板,依此类推.
Gam*_*ids 27
在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);
Run Code Online (Sandbox Code Playgroud)
这只是一个垂直排序所有子面板的示例(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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这只是一个示例,布局窗口有多种方法.这一切都取决于您的需求,以及您是否希望内容可以调整大小/响应.另一个非常好的方法是GridBagLayout,它可以处理相当复杂的布局,但是学习起来也很复杂.