Java中swing组件的基本问题?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中swing组件的基本问题?相关的知识,希望对你有一定的参考价值。
在理解这个简单的代码方面,我的问题可能非常基础。我自己编写了这段代码,从这里和那里了解一些代码。我想逐行跟踪这段代码,看看每行的含义是什么?我在代码行之上添加了我的理解作为注释,它可能是错误的,或者其中一些标记为****
意味着我只是不知道它意味着什么。如果你能在这里帮助我,那就太好了。谢谢
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.text.ParseException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class TestingSwingComponents {
public TestingSwingComponents() {
//Create a frame which is the window that pops up
JFrame myframe = new JFrame();
//*****
myframe.getContentPane().setLayout(new BorderLayout());
//set the frame size to be 600 X 600 size
myframe.setSize(600, 600);
// create Pane1
JPanel myPanel = new JPanel();
//set the Layout component of Panel, as how you would like it to be
//here it is 2 rows and 15 columns
myPanel.setLayout(new GridLayout(2, 15));
//create a button with text in it
JButton letterButton = new JButton("click Me");
//add the created button component to the panel
myPanel.add(letterButton);
//******
myframe.getContentPane().add(myPanel, BorderLayout.SOUTH);
// create another panel
JPanel panelFormat = new JPanel();
//create a textfield
JTextField txtfield = new JTextField();
//create a label for the textfield
JLabel label = new JLabel("Guesss");
//set the layout type for this panel
panelFormat.setLayout(new BorderLayout());
//add label to panel
panelFormat.add(label);
//add textfield to panel
panelFormat.add(txtfield);
//I dont know the difference between the below two
//BorderLayout.CENTER still does not center the panel in the frame, I dont know why
myframe.getContentPane().add(panelFormat, BorderLayout.CENTER);
myframe.add(panelFormat);
// default settings
myframe.setTitle("Get buttons");
myframe.setVisible(true);
myframe.setLocationRelativeTo(null);
myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) throws ParseException {
new TestingSwingComponents();
}
}
myframe.getContentPane().setLayout(new BorderLayout());
要回答这个问题,您需要了解Swing窗口的结构。 JFrame
(实际上是任何Swing窗口)由一系列组件组成,这些组件生成窗口视图。
(图片来自How to use Root Panes)
JRootPane
构成了视图的基础,其顶部是JLayeredPane
和所谓的“玻璃窗格”。 JLayeredPane
负责管理JMenuBar
和“内容窗格”。
内容窗格是组件驻留在窗口中的位置。
所以,这句话所说的是“获取框架的内容窗格并设置它的布局以使用BorderLayout
”
布局API本身就是一个完整的问题,你可以通过Laying out components within a container读取更多不同的描述,但基本上,布局管理器不需要你关心渲染中的差异(一个很大的交易)不同系统所需的技术......
//******
myframe.getContentPane().add(myPanel, BorderLayout.SOUTH);
这回到了布局管理器。因为您可以拥有任意数量的布局管理器,所以Swing允许您在添加组件时将“约束”传递给布局管理器,从而使布局管理器了解您可能希望如何添加此组件。
如果你仔细看看BorderLayout
,你会发现它有五个位置可以添加组件。
这条线基本上是说,“请将myPanel
添加到框架/内容窗格中的SOUTH
位置”
从评论更新
如果您看一下这个片段......
panelFormat.setLayout(new BorderLayout());
//add label to panel
panelFormat.add(label);
//add textfield to panel
panelFormat.add(txtfield);
它将panelFormat
的布局管理器设置为BorderLayout
。 BorderLayout
在其五个可用位置中的任何一个中只能有一个组件。当您使用add(Component)
而不传递布局约束时,BorderLayout
使用CENTER
作为默认位置,这意味着您尝试将两个组件添加到CENTER
位置,这是不可能的,因此BorderLayout
只使用添加的最后一个组件。
为什么不borderlayout修复文本字段的大小而不是拉伸所有窗口
因为这是BorderLayout
的工作原理而不是,GridLayout
可能会做类似的事情。
你可以试试FlowLayout
或GridBagLayout
从评论更新
你真的需要花时间阅读链接(和其他建议的)教程...但基本上,你可以像任何其他布局一样使用GridBagLayout
,你创建它的实例并将其应用到容器......
// create another panel
JPanel panelFormat = new JPanel();
//create a textfield
JTextField txtfield = new JTextField(10);
//create a label for the textfield
JLabel label = new JLabel("Guesss");
//set the layout type for this panel
panelFormat.setLayout(new GridBagLayout());
//add label to panel
panelFormat.add(label);
//add textfield to panel
panelFormat.add(txtfield);
//I dont know the difference between the below two
//BorderLayout.CENTER still does not center the panel in the frame, I dont know why
myframe.getContentPane().add(panelFormat, BorderLayout.CENTER);
myframe.add(panelFormat);
一个Swing顶层容器,包括一个JFrame,JDialog由几个组件组成,所有组件都保存在一起,包括一个整体保存在一起的JRootPane,一个JLayeredPane和一个contentPane,后者除了顶部窗口栏之外还拥有大部分GUI。您可以在此处阅读本教程中有关详细信息的更多信息:Top Level Containers:
因此,当您以默认方式将组件添加到JFrame时,实际上是将其添加到其contentPane中。换句话说,这个:
myJFrame.add(myComponent);
在功能上与此相同:
myJFrame.getContentPane().add(myComponent);
为了学习Swing,我使用了这个很棒的教程,它涵盖了你所拥有的一切,并且非常清楚地解释了它。
本教程还介绍了您无法理解的元素。
以上是关于Java中swing组件的基本问题?的主要内容,如果未能解决你的问题,请参考以下文章