Swing 高级组件
三、JToolBar 工具栏
- 工具栏中提供了快速执行常用命令的按钮,可固定在窗体某一位置也可自由拖动;如果想要工具栏可以自由拖动,那么窗体一定要采用默认的边界布局方式,并且不能在边界布局的四周添加任何组件。
- 工具栏默认可以拖动,也可以通过方法 setFloatable(bool b) 并将入口参数设置为 false 来实现工具栏固定。
- 工具栏(JToolBar)对象的常用构造方法如下:
1)JToolBar():创建新的工具栏,默认方向为 HORIZONTAL,使用该方法创建的工具栏,当工具栏脱离窗体时,工具栏则没有标题。
2)JToolBar(String name):创建具有指定标题的工具栏。 - JToolBar 类的常用方法如下表:
方法 | 说明 |
add(Component comp) | 将按钮添加到工具栏末尾 |
addSeparator() | 在按钮之间添加默认大小的分隔符 |
addSeparator(Dimension size) | 添加指定大小的分隔符 |
setMargin(Insets m) | 设置工具栏边框和按钮之间的空白 |
setOrientation(int o) | 设置工具栏的方向 |
- 示例:
package 高级Swing组件;
// !/usr/bin/env jdk1.8
// encoding:utf-8
//@software:IntelliJ IDEA
//@pack:高级Swing组件
//@user:彭友聪
//@date:2019/08/07
//@time:下午 12:06
//@project:IDEA_JAVA
//@file:JToolBarTest.java
//Author:御承扬
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JToolBarTest extends JFrame {
private static class ButtonListener implements ActionListener{
private ButtonListener() {
}
public final void actionPerformed(ActionEvent e) {
JButton button = (JButton) e.getSource();
System.out.println( "被单击的是:"+button.getText() );
}
}
private JToolBarTest() {
super();
setTitle( "工具栏示例" );
setBounds(100, 100, 500, 375);
setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
setVisible( true );
final JToolBar toolBar = new JToolBar("工具栏");// 创建工具栏对象
toolBar.setFloatable(true);// 设置为允许拖动
getContentPane().add(toolBar, BorderLayout.NORTH);// 添加到网格布局的上方
final JButton newButton = new JButton("新建");// 创建按钮对象
newButton.addActionListener(new ButtonListener());// 添加动作事件监听器
toolBar.add(newButton);// 添加到工具栏中
toolBar.addSeparator();// 添加默认大小的分隔符
final JButton saveButton = new JButton("保存");// 创建按钮对象
saveButton.addActionListener(new ButtonListener());// 添加动作事件监听器
toolBar.add(saveButton);// 添加到工具栏中
toolBar.addSeparator(new Dimension(20, 0));// 添加指定大小的分隔符
final JButton exitButton = new JButton("退出");// 创建按钮对象
exitButton.addActionListener(new ButtonListener());// 添加动作事件监听器
toolBar.add(exitButton);// 添加到工具栏中
}
public static void main(String[] args) {
JToolBarTest frame = new JToolBarTest();
}
}
- 运行效果如下:
- 控制台输出:
被单击的是:新建
被单击的是:保存
被单击的是:退出
四、文件选择器
- 在从文件倒入数据、选择用户照片时,需要选择文件的操作,Swing 程序中使用 javax.swing.JFileChooser 类实现该功能。
1、JFileChooser 文件选择对话框
- JFileChooser 提供了一个文件选择对话框,创建文件选择对话框和获取所选文件的步奏如下:
1)创建一个 JFileChooser 类对象。
2)通过 setMultiSelectionEnabled(boolean b) 函数设置是否支持同时选择多个文件,默认不支持(false),设为 true 后则支持文件多选。
3)默认情况只允许选择文件,不允许选择文件夹,可通过 setFileSelectionMode(int mode) 方法设置,入口常数的可选静态变量有 FILES_ONLY(只允许选择文件)、DIRECTORIES_ONLY(只允许选择路径)和 FILES_AND_DIRECTORIES(均可选择)
4)如果希望在对话框中只列出指定类型的文件,可调用方法 setFileFilter(FileFilter filter) 方法设置文件过滤器。
5)设置完成后调用 showOpenDialog(Component parent) 方法显示对话框,方法返回一个用于确定是否选择了文件或路径的 int 型值。
6)若用户选择了文件或路径,用 getSelectedFiles() 方法获取所选文件夹或用 getSelectedFile() 方法获得所选文件,因为前者返回的是一个 File 型数组,后者返回的是一个 File 型对象。 - 示例:
package 高级Swing组件;
// !/usr/bin/env jdk1.8
// encoding:utf-8
//@software:IntelliJ IDEA
//@pack:高级Swing组件
//@user:彭友聪
//@date:2019/08/07
//@time:下午 8:25
//@project:IDEA_JAVA
//@file:JFileChooserTest.java
//Author:御承扬
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
public class JFileChooserTest extends JFrame {
private JTextField textField;
private JFileChooserTest() {
super();
setTitle("文件选择器对话框示例");
setBounds(100,100,600,375);
setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
final JPanel panel = new JPanel( );
getContentPane().add(panel, BorderLayout.NORTH );
final JLabel label = new JLabel( "文件:" );
panel.add(label);
textField = new JTextField( );
textField.setColumns( 20 );
panel.add(textField);
final JButton button = new JButton( "上传" );
button.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser( ); // 创建文件选择对话框
int i = fileChooser.showOpenDialog( getContentPane() ); // 显示文件选择对话框
if(i == JFileChooser.APPROVE_OPTION){ // 判断用户单击的是否为“打开”按钮
File selectedFile = fileChooser.getSelectedFile(); // 获得选中的文件对象
textField.setText( selectedFile.getName() ); // 显示选中文件的名称
}
}
} );
panel.add( button );
}
public static void main(String[] args) {
JFileChooserTest frame = new JFileChooserTest();
frame.setVisible( true );
}
}
- 运行如下图:
2、FileFilter 文件过滤器
- 文件过滤器用于筛选文件类型,从而快速获取自己想要的文件类型的文件,Java 中通过 javax.swing.filechooser.FileFilter 类实现,该类是一个抽象类,其具体定义如下:
public abstract class FileFilter {
public abstract boolean accept(File f);
public abstract String getDescription();
}
- 其中,accept(File f) 用来过滤文件,返回 true 则表示显示到文件选择对话框中,反之则不显示;getDescription() 方法用来返回对话框中“文件类型”的描述信息。
- FileFilter 抽象类提供了实现类:FileNameExtensionFilter,构造方法为:FileNameExtensionFilter(String description, String…extension) 构造方法,第一个参数为文件类型描述信息,其余为允许显示到文件选择对话框中的文件类型。
- 示例
package 高级Swing组件;
// !/usr/bin/env jdk1.8
// encoding:utf-8
//@software:IntelliJ IDEA
//@pack:高级Swing组件
//@user:彭友聪
//@date:2019/08/08
//@time:上午 9:07
//@project:IDEA_JAVA
//@file:FileFilterTest.java
//Author:御承扬
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
public class FileFilterTest extends JFrame {
private FileFilterTest(){
super();
setTitle( "选择照片对话框" );
setBounds(100,100,500,375);
setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
final JLabel label = new JLabel( "<双击选择照片>", SwingConstants.CENTER );
label.addMouseListener( new MouseAdapter() {
JFileChooser fileChooser;
{
fileChooser = new JFileChooser( );
// 设置文件过滤器,只列出JPG格式或GIF格式的图片
FileFilter filter = new FileNameExtensionFilter( "图像文件(JPG/GIF)", "JPG", "GIF" );
fileChooser.setFileFilter( filter );
}
@Override
public void mouseClicked(MouseEvent e) {
if(e.getClickCount() == 2) {
int i = fileChooser.showOpenDialog( getContentPane() );
if(i == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
label.setIcon( new ImageIcon( selectedFile.getAbsolutePath() ) );
label.setText( null );
}
}
}
} );
getContentPane().add(label, BorderLayout.CENTER );
}
public static void main(String[] args) {
FileFilterTest frame = new FileFilterTest();
frame.setVisible( true );
}
}
- 运行效果如下图: