Java Swing/Swing
好的,现在是时候深入 Swing 了。启动您的文本编辑器或 IDE,然后输入以下代码。
HelloSwing.java
import javax.swing.JFrame;
public class HelloSwing {
public static void main(String[] args) {
JFrame frame = new JFrame(); //We create a new frame
frame.setSize(200, 100); //Setting size of width=200px and height=100px
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Frame must close when close button is pressed
frame.setVisible(true);
}
}
|
输出
编译代码并运行它。如果您获得如上所示的输出,则表示您已全部做对了。
现在让我们看看它是如何工作的。与所有 Java 程序一样,该程序从创建一个类开始,我们将其命名为HelloSwing。该类包含程序从其开始执行的 main 方法。该函数中的第一行是
代码部分
JFrame frame = new JFrame();
|
在第一行中,我们创建新的 Java 框架或 JFrame。框架不过是一个 Swing 容器,它包含其他组件,如标签、按钮、文本字段、菜单栏等。现在,由于我们已经创建了一个框架,并且在显示它之前,我们需要设置它的尺寸。要设置框架的尺寸,我们使用以下代码
代码部分
frame.setSize(200, 100);
|
setSize(int width, int height)接受两个参数,第一个是框架宽度,第二个是框架高度。我们已将框架尺寸设置为 200 像素(px)宽,100px 高。因此,框架尺寸已成功设置。
现在,如果有人点击框架中的关闭按钮会发生什么?我们希望程序退出并清除内存,因此在点击关闭按钮时,我们使用setDefaultCloseOperation()函数来关闭框架。我们希望程序在按下关闭按钮时退出,因此我们使用以下代码
代码部分
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
所有操作都已正确完成,我们现在需要做的就是使框架可见。为此,我们使用setVisible(boolean b)函数。该函数接受一个布尔输入。如果传入 true,则框架可见,否则如果传入 false,则框架不可见。为了使框架可见,我们使用以下代码
代码部分
frame.setVisible(true);
|
因此,我们创建了 HelloSwing 程序。
在最后一个示例中,我们看到了如何创建一个没有任何内容的框架。这次我们将创建一个带标题的框架。为此,让我们创建一个类FrameWithTitle
。所有代码与之前的示例完全相同,只有一个变化。请注意 main 方法中的第一个语句
代码部分
JFrame frame = new JFrame("Hello Swing");
|
在这里,new JFrame()构造函数获取一个字符串参数。此参数构成框架的标题。简单!
FrameWithTitle.java
import javax.swing.JFrame;
public class FrameWithTitle {
public static void main(String[] args) {
JFrame frame = new JFrame("Hello Swing"); // We create a new frame
frame.setSize(200, 100); // Setting size of width=200px and height=100px
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Frame must close when closed button is presses
frame.setVisible(true);
}
}
|
输出
编译 FrameWithTitle 代码将给出如上所示的输出。
我们已经创建了一个空框架,一个带标题的框架,现在让我们看看如何向框架添加一个简单的组件。标签是一个简单的组件,我们将把它添加到我们的框架中。仔细阅读以下程序。与之前的示例相比,它有一个新语句。
AddingLabel.java
import javax.swing.JFrame;
import javax.swing.JLabel;
public class AddingLabel {
public static void main(String[] args) {
JFrame frame = new JFrame("Hello Swing"); // We create a new frame
frame.setSize(200, 100); // Setting size of width=200px and height=100px
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Frame must close when closed button is presses
frame.add(new JLabel("Diving into swing!")); // Adding a label
frame.setVisible(true);
}
}
|
输出
看看这行
代码部分
frame.add(new JLabel("Diving into swing!"));
|
在这行中,我们使用add()函数告诉计算机将一个组件或对象添加到框架中。由于我们要添加一个标签,因此我们使用new JLabel()命令传递一个新的标签对象。
new JLabel("Diving into swing!")
创建一个新的标签。添加后,框架使用frame.setVisible(true);
显示。
如果一切都做对了,您应该得到如上所示的输出。
LabelnText.java
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class LabelnText {
public static void main(String[] args) {
JFrame frame = new JFrame("Hello Swing"); // We create a new frame
frame.setSize(200, 100); // Setting size of width=200px and height=100px
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Frame must close when closed button is presses
frame.add(new JLabel("Diving into swing!")); // Adding a label
frame.add(new JTextField("Type something here"));// Adding text field
frame.setVisible(true);
}
}
|
输出
在最后一个示例(AddingLabel.java)中,我们看到了如何将 JLabel 添加到 JFrame。现在,我们将通过添加更多组件来扩展我们的知识。让我们添加一个文本字段(即 JTextField)以及标签。上面显示的程序(LabelnText.java)与 AddingLabel.java 的代码相同,但略有不同。看看倒数第二行frame.add(new JTextField("Type something here"));
,在这行中,我们使用add()方法将JTextField添加到框架中。在 add 方法中,我们使用new JTextField("Type something here")语句传递一个新的 JTextField。JTextField()构造函数可以接受一个字符串参数,该参数设置为文本字段的文本值。
因此,当我们运行示例时,我们希望框架在它的右侧有一个标签和一个文本字段。但是看看输出。哪里错了?我们只看到一个占用了整个框架的文本字段!Java 有 bug 吗?答案是标签和文本字段都存在于框架中。文本字段绘制在标签的顶部。
Java 虚拟机很傻。您告诉它放一个标签,它就放了一个标签到框架上,接下来您告诉它放一个文本字段,它就忠实地执行了。但它把文本字段放在了标签的顶部。为了获得期望的输出,比如标签和文本字段并排放置,我们必须使用所谓的布局管理器,稍后将对此进行简要介绍。
LayoutManagerDemo.java
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class LayoutManagerDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("Hello Swing"); // We create a new frame
frame.setSize(200, 100); // Setting size of width=200px and height=100px
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Frame must close when closed button is presses
frame.setLayout(new FlowLayout()); // Adding layout, flow layout in this case
frame.add(new JLabel("Diving into swing!")); // Adding a label
frame.add(new JTextField("Type something here")); // Adding text field
frame.setVisible(true);
}
}
|
输出
让我们看看如果我们改变框架尺寸会发生什么。
LayoutManagerDemo1.java
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class LayoutManagerDemo1 {
public static void main(String[] args) {
JFrame frame = new JFrame("Hello Swing"); // We create a new frame
frame.setSize(500, 100); // Setting size of width=500px and height=100px
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Frame must close when closed button is presses
frame.setLayout(new FlowLayout()); // Adding layout, flow layout in this case
frame.add(new JLabel("Diving into swing!")); // Adding a label
frame.add(new JTextField("Type something here")); // Adding text field
frame.setVisible(true);
}
}
|
输出
打包优化了框架的大小。
PackingFrames.java
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class PackingFrames {
public static void main(String[] args) {
JFrame frame = new JFrame("Hello Swing"); // We create a new frame
//frame.setSize(500, 100); // Setting size of width=200px and height=100px
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Frame must close when closed button is presses
frame.setLayout(new FlowLayout());
frame.add(new JLabel("Diving into swing!")); // Adding a label
frame.add(new JTextField("Type something here")); // Adding text field
frame.pack(); // Packing components into frames. This is like auto sizing of frames
frame.setVisible(true);
}
}
|
输出