一、文件对话框
Swing中提供了JFileChooser类显示一个文件对话框,JFileChooser类不是JDialog的子类,其需要调用showSaveDialog或者showOpenDialog方法来显示保存文件的对话框或者打开文件的对话框。
当然也可以调用showDialog方法显示自定义标签的对话框。
建立JFileChooser对象,其不需要指定父组件,允许在多个框架中重用一个文件选择器。
JFileChooser fileChooser = new JFileChooser();
调用setCurrentDirectory方法设定目录
fileChooser.setCurrentDirectory(new File(".")); //此处设定目录为当前目录
如果希望预先选择默认的文件名,则调用setSelectedFile方法指定
fileChooser.setSelectedFile(new File(fileName));
如果允许在对话框中选择多个文件,则调用setMultiSelectionEnabled方法设定
fileChooser.setMultiSelectionEnabled(true);
默认情况对话框中只能选择文件,当然也可以设定选择目录,参数值为JFileChooser.FILES_ONLY,JFileChooser.DIRECTORIES_ONLY,JFileChooser.FILES_AND_DIRECTORIES。
fileChooser.setFileSelectionMode(JFileChooser.xxxxx);
若想限制对话框中显示的文件类型,则需要用到文件过滤器,抽象类javax.swing.filechooser.FileFilter。文件选择器把每个文件传递给文件过滤器,只有文件过滤器接受的文件才会显示出来。
编写专用文件过滤器
class GifFilter extends FileFilter
{
public boolean accept(File f)
{
return f.getName().toLowerCase().endsWith("gif")||f.isDirectory();
}
public String getDescription()
{
return "GIF Only";
}
}
将文件过滤器安装到文件选择对话框
fileChooser.addChoosableFileFilter(new GifFilter());
也可以为一个文件选择对话框安装多个过滤器。用户可以从文件对话框底部的组合框选择过滤器。默认情况下"All files"过滤器总是显示在组合框中。
如果想不使用All files过滤器,则调用setAcceptAllFileFilterUsed方法。
fileChooser.setAcceptAllFileFilterUsed(false);
如果为加载和保存不同类型的文件重用一个文件选择器,则调用resetChoosableFilters()方法就可以在加载新的过滤器之前清除旧的过滤器。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.filechooser.*;
import javax.swing.filechooser.FileFilter;
import java.beans.*;
public class FileChooserTest01
{
public static void main(String[] args)
{
FileChooserFrame fileChooserFrame = new FileChooserFrame();
fileChooserFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fileChooserFrame.setVisible(true);
}
}
class FileChooserFrame extends JFrame
{
public FileChooserFrame()
{
setTitle("file chooser test");
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
//处理菜单
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
openMenuItem = new JMenuItem("Open");
exitMenuItem = new JMenuItem("Exit");
fileMenu.add(openMenuItem);
fileMenu.add(exitMenuItem);
menuBar.add(fileMenu);
setJMenuBar(menuBar);
//菜单添加监听器
exitMenuItem.addActionListener(new exitActionListener());
openMenuItem.addActionListener(new openActionListener());
myPanel = new MyPanel();
fileChooser = new JFileChooser();
fileFilter = new FileNameExtensionFilter("Image only","JPG","JPEG");
fileChooser.setCurrentDirectory(new File("."));
fileChooser.addChoosableFileFilter(fileFilter);
fileChooser.setSelectedFile(new File("2b.jpg"));
fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
fileChooser.setMultiSelectionEnabled(true);
//fileChooser.setAcceptAllFileFilterUsed(false);
Toolkit kit = Toolkit.getDefaultToolkit();
Image img = kit.getImage("test1.jpg");
Image imgc = img.getScaledInstance(15,15,5);
fileChooser.setFileView(new FileIconView(fileFilter,new ImageIcon(imgc)));
fileChooser.setAccessory(new ImagePreView(fileChooser));
add(myPanel,BorderLayout.CENTER);
}
class exitActionListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
}
class openActionListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
int result = fileChooser.showOpenDialog(myPanel);
if(result == JFileChooser.APPROVE_OPTION)
{
String name = fileChooser.getSelectedFile().getPath();
myPanel.setFileName(name);
repaint();
}
}
}
private static final int DEFAULT_WIDTH = 1000;
private static final int DEFAULT_HEIGHT = 600;
private JMenuItem openMenuItem;
private JMenuItem exitMenuItem;
private JFileChooser fileChooser;
private FileFilter fileFilter;
private MyPanel myPanel;
}
class FileIconView extends FileView
{
public FileIconView(FileFilter fileFilter,Icon c)
{
this.fileFilter=fileFilter;
icon=c;
}
public Icon getIcon(File f)
{
if(!f.isDirectory()&&fileFilter.accept(f))
{
return icon;
}
return null;
}
private FileFilter fileFilter;
private Icon icon;
}
class ImagePreView extends JLabel
{
public ImagePreView(JFileChooser f)
{
setPreferredSize(new Dimension(100,100));
setBorder(BorderFactory.createEtchedBorder());
f.addPropertyChangeListener(new PropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent e)
{
if(e.getPropertyName()==JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)
{
File f = (File)e.getNewValue();
if(f==null)
{
setIcon(null);
return;
}
ImageIcon icon = new ImageIcon(f.getPath());
if(icon.getIconWidth()>getWidth())
{
icon = new ImageIcon(icon.getImage().getScaledInstance(getWidth(),-1,Image.SCALE_DEFAULT));
}
setIcon(icon);
}
}
});
}
}
class MyPanel extends JPanel
{
public void paintComponent(Graphics g)
{
if(!fileName.equals(""))
{
ImageIcon icon = new ImageIcon(fileName);
Image image = icon.getImage();
super.paintComponent(g);
if(image == null)
return;
Graphics2D gps2D = (Graphics2D)g ;
gps2D.drawImage(image,0,0,getWidth(),getHeight(),null);
}
}
public void setFileName(String fileName)
{
this.fileName=fileName;
}
private String fileName="";
}
运行结果:
二、颜色选择器
Swing提供了选择器JColorChooser用于挑选颜色值。其与JFileChooser类似,是组件不是对话框。
显示模式对话框
Color selectedColor = JColorChooser.showDialog(parent,title,initialColor);
也可以调用createDialog方法显示无模式对话框
若需要颜色实时反馈,则需要获取选择器的选择模型并添加改变监听器。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
public class ColorChooserTest01
{
public static void main(String[] args)
{
ColorChooserFrame ColorChooserFrame = new ColorChooserFrame();
ColorChooserFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ColorChooserFrame.setVisible(true);
}
}
class ColorChooserFrame extends JFrame
{
public ColorChooserFrame()
{
setTitle("Color chooser test");
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
ColorChoosePanel panel = new ColorChoosePanel();
add(panel);
}
private static final int DEFAULT_WIDTH = 1000;
private static final int DEFAULT_HEIGHT = 600;
}
class ColorChoosePanel extends JPanel
{
public ColorChoosePanel()
{
JButton button1 = new JButton("button1");
JButton button2 = new JButton("button2");
JButton button3 = new JButton("button3");
button1.addActionListener(new ColorListener1());
button2.addActionListener(new ColorListener2());
button3.addActionListener(new ColorListener3());
add(button1);
add(button2);
add(button3);
}
class ColorListener1 implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
Color defaultColor = getBackground();
Color selected = JColorChooser.showDialog(ColorChoosePanel.this,"set background",defaultColor);
if(selected != null)
setBackground(selected);
}
}
class ColorListener2 implements ActionListener
{
public ColorListener2()
{
chooser = new JColorChooser();
dialog=chooser.createDialog(ColorChoosePanel.this,"set background",false,chooser,
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
setBackground(chooser.getColor());
}
},null
);
}
public void actionPerformed(ActionEvent e)
{
chooser.setColor(getBackground());
dialog.setVisible(true);
}
private JDialog dialog;
private JColorChooser chooser;
}
class ColorListener3 implements ActionListener
{
public ColorListener3()
{
chooser = new JColorChooser();
chooser.getSelectionModel().addChangeListener(
new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
setBackground(chooser.getColor());
}
}
);
dialog=new JDialog((Frame)null,false);
dialog.add(chooser);
dialog.pack();
}
public void actionPerformed(ActionEvent e)
{
chooser.setColor(getBackground());
dialog.setVisible(true);
}
private JDialog dialog;
private JColorChooser chooser;
}
}
运行结果: