? ? ? 到目前为止,我们编写的都是基于控制台输入的程序,操作使用非常不直观;
? ? ? GUI(Graphical User Interface)即图形用户界面,是指采用图形方 式显示的用户界面,与早期计算机使用的命令行界面相比,图形界面对 于用户来说在视觉上更易于接受。
? ? ? 功能组件不能独立地显示出来,必须将组件放在一定的容器(container)中才 可以显示出来。容器可以容纳多个组件,通过调用容器的add(Component comp)方法向容 器中添加组件。窗口(JFrame)和面板(JPanel)是最常用的两个容器。
? ? ? 我们的类可以直接继承该类,实现窗口制作,类似于之前继承异常类,一般情况下要自定义构造方法,此时每创建一个该类对象,则创建了一个窗口。
setTitle(String title):设置窗口的标题。
setSize(int width, int height):设置窗口的大小。
setLocation(int x, int y):设置窗口的位置。
setResizable(boolean resizable):设置窗口是否可调整大小。
setDefaultCloseOperation(int operation):设置窗口关闭时的操作。
getContentPane():返回内容面板。
add(Component comp):添加组件。
setVisible(boolean visible):设置窗口是否可见。
pack():自适应窗口大小。
setLayout(LayoutManager mgr):设置布局管理器。
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE):设置窗口关闭时的操作为退出程序。
remove(Component comp):移除组件。
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE):设置窗口关闭时的操作为销毁窗口并释放资源。
setJMenuBar(JMenuBar menubar):设置菜单栏。
setSize(Dimension d):设置窗口的大小。
setPreferredSize(Dimension preferredSize):设置窗口的首选大小。
setBackground(Color color):设置窗口的背景颜色。
- (1)JFrame.EXIT_ON_CLOSE:关闭窗口时退出程序;
- (2)JFrame.HIDE_ON_CLOSE:关闭窗口时隐藏窗口。
- (3)JFrame.DISPOSE_ON_CLOSE:关闭窗口时销毁窗口并释放资源。
- (4)JFrame.DO_NOTHING_ON_CLOSE:关闭窗口时什么也不做。
getContentPane()方法的好处是,可以将组件添加到内容面板的默认布局管理器中,而不是添加到顶层容器的默认布局管理器中。
import javax.swing.*;
import java.awt.*;
public class MyFrame extends JFrame {
public MyFrame() throws HeadlessException {
this.setTitle("我是窗口的标题");
this.setSize(400,400);
this.setLocation(200,400);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建按钮
JButton button = new JButton("Click me");
// 获取内容面板
Container contentPane = getContentPane();
// 在内容面板上添加按钮
contentPane.add(button);
//也可以使用this,add(button);
//this.pack();
this.setBackground(Color.BLUE);
this.setVisible(true);
}
public static void main(String[] args) {
MyFrame frame = new MyFrame();
}
}
? ? ? 轻量级的容器,可添加其他组件,也可以设置布局(布局嵌套),可继承
JPanel是Swing中一个常用的容器组件,它继承自JComponent类,可以用来包含其他的组件。
以下是JPanel常用的方法:
add(Component comp): 向面板中添加组件。
remove(Component comp): 从面板中移除组件。
setLayout(LayoutManager manager): 设置面板的布局管理器。
setOpaque(boolean isOpaque): 设置面板是否不透明。
setBackground(Color color): 设置面板的背景颜色。
getSize(): 获取面板的大小。
setLocation(int x, int y): 设置面板在父容器中的位置。
setVisible(boolean visible): 设置面板是否可见。
setEnabled(boolean enabled): 设置面板是否可用。
setPreferredSize(Dimension preferredSize): 设置面板的首选大小。
getComponent(int index): 获取指定索引位置的组件。
getComponents(): 获取面板中所有的组件。
getLayout(): 获取面板的布局管理器。
setBorder(Border border): 设置面板的边框。
revalidate(): 重新布局面板中的组件。
repaint(): 重新绘制面板。
import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;
public class MyFrame extends JFrame {
public MyFrame() throws HeadlessException {
// 修改标题
this.setTitle("My Frame");
this.setSize(400,400);
this.setLocation(200,400);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new GridLayout(2,1));
// 创建按钮
JButton button = new JButton("Click me");
JPanel jPanel = new JPanel();
// 修改按钮文本
button.setText("Press me");
// 获取内容面板
Container contentPane = getContentPane();
// 在内容面板上添加按钮
jPanel.add(button);
jPanel.setSize(200,200);
contentPane.add(jPanel);
//this.pack();
// 修改背景颜色
contentPane.setBackground(new Color(189, 215, 238));
JPanel panel = new JPanel();
// 修改背景颜色
panel.setBackground(new Color(119, 34, 255));
// 修改位置
panel.setLocation(80, 80);
panel.setBorder(new LineBorder(Color.black, 2));
panel.setVisible(true);
this.add(panel);
this.setVisible(true);
}
public static void main(String[] args) {
MyFrame frame = new MyFrame();
}
}
? ? ? 第一段中设置了背景颜色,但没有显示,这里是因为button外层没有面板组件,所以将button加入窗口中时,按钮占据了整个空间,颜色就没有显示,但第二段代码中,button有了外层面板,所以就可以显示背景元素了。
? ? ? 流式布局(默认布局),把组件放在一排,从左到右排放,一行占满后,重新开启一行,如果想要面板居中,可以通过构造方法控制,例如:
JPanel jpanel = new JPanel(new FlowLayout(FlowLayout.LEFT,10,30);
对上述构造方法进行解释:
import javax.swing.*;
import java.awt.*;
public class FlowLayoutExample {
public static void main(String[] args) {
// 创建一个 JFrame 对象作为窗口
JFrame frame = new JFrame("FlowLayout Example");
// 设置窗口的大小和布局管理器
frame.setSize(400, 300);
frame.setLayout(new FlowLayout());
// 创建一些按钮组件
JButton button1 = new JButton("Button 1");
JButton button2 = new JButton("Button 2");
JButton button3 = new JButton("Button 3");
JButton button4 = new JButton("Button 4");
JButton button5 = new JButton("Button 5");
// 将按钮组件添加到窗口中
frame.add(button1);
frame.add(button2);
frame.add(button3);
frame.add(button4);
frame.add(button5);
// 设置窗口可见
frame.setVisible(true);
}
}
? ? ? 只允许在容器内放置5个组件,这5个组件的位置由BorderLayout类中的North、South、East、West和Center5个常量来确定的,他们对应这容器中的上下左右中,中间的区域是必须的,其他几个区域可以根据需要使用,注意:中间区域为默认,先加的会被后加的面板覆盖。
import javax.swing.*;
import java.awt.*;
public class BorderLayoutExample {
public static void main(String[] args) {
// 创建一个窗口
JFrame frame = new JFrame("BorderLayout Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
// 创建容器,并设置边界布局
Container container = frame.getContentPane();
container.setLayout(new BorderLayout());
// 在北区域添加一个标签
JLabel northLabel = new JLabel("北区域");
container.add(northLabel, BorderLayout.NORTH);
// 在南区域添加一个按钮
JButton southButton = new JButton("南区域");
container.add(southButton, BorderLayout.SOUTH);
// 在东区域添加一个文本框
JTextField eastTextField = new JTextField("东区域");
container.add(eastTextField, BorderLayout.EAST);
// 在西区域添加一个复选框
JCheckBox westCheckBox = new JCheckBox("西区域");
container.add(westCheckBox, BorderLayout.WEST);
// 在中区域添加一个文本区域
JTextArea centerTextArea = new JTextArea("中区域");
container.add(centerTextArea, BorderLayout.CENTER);
// 显示窗口
frame.setVisible(true);
}
}
? ? ? 类似一个表格,可以设置行数和列数,每个网格只能放一个组件,占满整个区域,从第一行开始摆放,第一行占满后,再开启第二行。
import javax.swing.*;
import java.awt.*;
public class GridLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("Grid Layout Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建一个面板,并设置为网格布局
JPanel panel = new JPanel(new GridLayout(3, 3)); // 创建一个3行3列的网格布局
// 向面板中添加按钮
for (int i = 1; i <= 9; i++) {
JButton button = new JButton("Button " + i);
panel.add(button);
}
// 将面板添加到窗口中
frame.add(panel);
// 设置窗口大小并显示
frame.setSize(300, 300);
frame.setVisible(true);
}
}
Java中的GUI组件包括但不限于以下几种:
这些组件可以根据需要进行组合和布局,构建出各种复杂的GUI界面。
下面,我们将对部分组件进行详细讲解:
标签是容纳文本和图标的控件,通常用来在界面中识别的控件;
new JLabel();? ? ?==>创建一个空的标签
new JLabel(String string);? ? ?==>创建一个带文本的标签
常见字体:ITALIC——斜体,PLAIN——普通,UNDERLINED——下划线,两者之间可以一起使用,用“|”连接。
import javax.swing.*;
public class JLabelExample extends JFrame{
public static void main(String[] args) {
JFrame frame = new JFrame("JLabel Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建一个JLabel对象,设置文本内容为"Hello World"
JLabel label = new JLabel("Hello World");
// 设置水平对齐方式为居中对齐
label.setHorizontalAlignment(SwingConstants.CENTER);
// 设置垂直对齐方式为中心对齐
label.setVerticalAlignment(SwingConstants.CENTER);
// 将JLabel添加到窗口中
frame.getContentPane().add(label);
frame.setSize(300, 200);
frame.setVisible(true);
}
}
JTextField是Java中用于接收用户输入文本的文本框组件。它允许用户在文本框内输入文字,并可以通过代码来获取文本框中的内容。
new JTextField(int columns);? ? ?==>创建一个可以输入columns个字符的单行文本
setText(String text):设置文本框的初始文本内容。
getText():获取文本框中的文本内容。
setColumns(int columns):设置文本框的宽度,以显示指定数量的字符。
setEditable(boolean editable):设置文本框是否可编辑。
setHorizontalAlignment(int alignment):设置文本框中文本的水平对齐方式。可选值有SwingConstants.LEFT(左对齐)、SwingConstants.CENTER(居中对齐)和SwingConstants.RIGHT(右对齐)。
setToolTipText(String text):为文本框设置鼠标悬停时显示的提示信息。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JTextFieldExample extends JFrame{
public static void main(String[] args) {
JFrame frame = new JFrame("JTextField Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建一个JTextField对象
JTextField textField = new JTextField();
// 设置文本框的初始文本
textField.setText("Enter text here");
// 设置文本框的宽度
textField.setColumns(20);
// 创建一个按钮
JButton button = new JButton("Get Text");
// 添加按钮的点击事件监听器
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取文本框中的内容
String text = textField.getText();
// 在控制台打印获取到的文本内容
System.out.println("Text: " + text);
}
});
// 将文本框和按钮添加到窗口中
frame.getContentPane().add(textField);
frame.getContentPane().add(button);
frame.setSize(300, 200);
frame.setLayout(new FlowLayout());
frame.setVisible(true);
}
}
JTextArea是Java中用于显示多行文本的组件,它可以允许用户在其中输入和编辑文本内容。
new JTextArea(int H,int W);? ? ?==>创建一个指定行数和列数的空文本域
setText(String text):设置文本区域的文本内容。
getText():获取文本区域的文本内容。
setEditable(boolean editable):设置文本区域是否可编辑。
setLineWrap(boolean wrap):设置文本区域是否自动换行。
setWrapStyleWord(boolean word):设置自动换行时是否按单词边界换行。
getLineCount():获取文本区域中的行数。
setRows(int rows):设置文本区域的行数。
append(String text):在文本区域的末尾追加文本内容。
insert(String text, int position):在指定位置插入文本内容。
replaceRange(String text, int start, int end):替换指定范围内的文本内容。
setFont(Font font):设置文本区域的字体。
如果需要文本区自动出现滚动条,可将文本区对象放入滚动窗格(JScrollPane)中:
JScrollPane pane = new JScrollPane(textArea);
this.add(pane);
import javax.swing.*;
import java.awt.*;
public class JTextAreaExample extends JFrame{
public static void main(String[] args) {
JFrame frame = new JFrame("JTextArea Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextArea textArea = new JTextArea();
textArea.setText("Enter text here");
textArea.setEditable(true);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setFont(new Font("Arial", Font.PLAIN, 12));
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setPreferredSize(new Dimension(300, 200));
frame.getContentPane().add(scrollPane);
frame.pack();
frame.setVisible(true);
}
}
JPasswordField是Java中用于输入密码的组件,它继承自JTextField,但显示的内容是用星号(*)或其他自定义字符来代替实际的密码字符。
JPasswordField():创建一个默认的密码字段对象,长度为0。
JPasswordField(int columns):创建一个指定长度的密码字段对象,可以容纳指定数目的字符。
JPasswordField(String text):创建一个包含指定文本的密码字段对象。
JPasswordField(String text, int columns):创建一个包含指定文本和长度的密码字段对象。
getPassword():返回一个字符数组,该数组包含用户输入的密码。
setPassword(char[] password):将指定的字符数组设置为密码字段的内容。
setEditable(boolean editable):设置密码字段是否可编辑。
getText():返回密码字段的文本内容。注意,getText()方法返回的是一个字符串,而不是字符数组。
setText(String text):将指定的字符串设置为密码字段的内容。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JPasswordFieldExample extends JFrame {
private JTextField usernameField;
private JPasswordField passwordField;
private JButton loginButton;
public JPasswordFieldExample() {
setTitle("Password Field Example");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
usernameField = new JTextField(20);
passwordField = new JPasswordField(20);
loginButton = new JButton("Login");
loginButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String username = usernameField.getText();
char[] password = passwordField.getPassword();
// 在此处添加验证用户名密码的代码
// 清空密码字段
passwordField.setText("");
}
});
add(new JLabel("Username:"));
add(usernameField);
add(new JLabel("Password:"));
add(passwordField);
add(loginButton);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new JPasswordFieldExample();
}
});
}
}
JButton是Java Swing库中的一个类,用于创建可点击的按钮组件。它继承自AbstractButton类,并提供了各种方法和事件来实现按钮的功能。
JButton() 创建一个没有文本和图标的普通按钮。
JButton(String text) 创建一个带有指定文本的普通按钮。
JButton(Icon icon) 创建一个带有指定图标的普通按钮。
JButton(String text, Icon icon) 创建一个带有指定文本和图标的普通按钮。
设置按钮的文本内容:
JButton button = new JButton();
button.setText("Click me!");
设置按钮的图标:
JButton button = new JButton();
Icon icon = new ImageIcon("path/to/icon.png");
button.setIcon(icon);
添加按钮点击事件监听器:
JButton button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//处理按钮点击事件的逻辑
}
});
设置按钮的提示文本:
JButton button = new JButton();
button.setToolTipText("This is a button");
设置按钮按下时的图标:
JButton button = new JButton();
Icon pressedIcon = new ImageIcon("path/to/pressedIcon.png");
button.setPressedIcon(pressedIcon);
设置按钮的快捷键:
JButton button = new JButton();
button.setMnemonic(KeyEvent.VK_ENTER); //设置回车键为按钮的快捷键
设置按钮的边框样式:
JButton button = new JButton();
button.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); //设置2像素的黑色边框
设置按钮的前景色和背景色:
JButton button = new JButton();
button.setForeground(Color.RED); //设置文本颜色为红色
button.setBackground(Color.YELLOW); //设置背景色为黄色
构造方法:JMenuBar();
方法:add(menu);
构造方法:JMenu(“菜单名称");
方法:add(menuItem);
构造方法:JMenuItem(“菜单项名称");
将菜单栏添加到窗口 setJMenuBar(menuBar);
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MenuExample extends JFrame {
private JMenuBar menuBar;
private JMenu fileMenu;
private JMenuItem openMenuItem;
private JMenuItem saveMenuItem;
public MenuExample() {
// 创建菜单栏
menuBar = new JMenuBar();
// 创建菜单
fileMenu = new JMenu("File");
// 创建菜单项
openMenuItem = new JMenuItem("Open");
saveMenuItem = new JMenuItem("Save");
// 为菜单项添加点击事件监听器
openMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 处理打开菜单项的逻辑
System.out.println("Open menu item clicked");
}
});
saveMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 处理保存菜单项的逻辑
System.out.println("Save menu item clicked");
}
});
// 将菜单项添加到菜单
fileMenu.add(openMenuItem);
fileMenu.add(saveMenuItem);
// 将菜单添加到菜单栏
menuBar.add(fileMenu);
// 将菜单栏设置为窗口的菜单栏
setJMenuBar(menuBar);
// 设置窗口的基本属性
setTitle("Menu Example");
setSize(300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MenuExample();
}
});
}
}
??
要实现相应的功能,必须进行事件处理。
一个事件源产生一个事件并把它送到监听器那里,监听器一直等待,直到它收到一个事件,一旦事件被接收,监听器将处理这些事情。
监听组件有没有事件产生,一旦点击了某个按钮产生事件,监听器就捕获到这件事情,从而去调用对应的实践处理程序。
方法名:addActionListener
使用方法:
组件对象.addActionListener(new ActionListener(){
? ? //进行事件处理
? ? public void actionPerformed(){
? ? ? ? //执行的操作
? ? }
});
例如菜单组件的例子。
特点:所有的方法都为抽象方法,即需要全部重写;
方法:
特点:适配器,可以只重写一种或多种,没必要全写
方法同上
注意:一般要用内部类重写方法
特点:适配器
方法同mouse
方法:
showMessageDialog是JOptionPane类中的一个静态方法,用于显示一个简单的消息对话框。该方法有多个重载形式,可以用于显示不同类型的消息对话框,如信息、警告、错误等。
import javax.swing.*;
public class MessageDialogExample extends JFrame {
public static void main(String[] args) {
// 显示一个简单的信息对话框
JOptionPane.showMessageDialog(null, "Hello, World!");
// 显示一个带有标题的信息对话框
JOptionPane.showMessageDialog(null, "Welcome to Java", "Message", JOptionPane.INFORMATION_MESSAGE);
// 显示一个警告对话框
JOptionPane.showMessageDialog(null, "Something went wrong", "Warning", JOptionPane.WARNING_MESSAGE);
// 显示一个错误对话框
JOptionPane.showMessageDialog(null, "An error occurred", "Error", JOptionPane.ERROR_MESSAGE);
}
}
第一个参数为null,第二个参数为提示信息,第三个参数为标题,第四个参数为对话框类型
showConfirmDialog是JOptionPane类中的一个静态方法,用于显示一个确认对话框。该方法可以用于询问用户是否同意某个操作,并返回用户的选择。
import javax.swing.*;
public class ConfirmDialogExample extends JFrame {
public static void main(String[] args) {
// 显示一个简单的确认对话框
int result = JOptionPane.showConfirmDialog(null, "Are you sure?", "Confirmation", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
System.out.println("User clicked Yes");
} else {
System.out.println("User clicked No");
}
// 显示一个带有自定义按钮的确认对话框
String[] options = {"Yes", "No", "Cancel"};
int result2 = JOptionPane.showOptionDialog(null, "Choose an option", "Confirmation", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
if (result2 == JOptionPane.YES_OPTION) {
System.out.println("User clicked Yes");
} else if (result2 == JOptionPane.NO_OPTION) {
System.out.println("User clicked No");
} else if (result2 == JOptionPane.CANCEL_OPTION) {
System.out.println("User clicked Cancel");
}
}
}