文件選擇對話(huà)框,顏色選擇對話(huà)框,分隔線(xiàn)的使用與介紹
++ Swing程序設計
++ JFileChoose,JColorChooer,JSeparator
文件選擇對話(huà)框,顏色選擇對話(huà)框,分隔線(xiàn)的使用與介紹.
13-1:使用JFileChooser組件.
JFileChooser的類(lèi)層次結構圖:
java.lang.Object
--java.awt.Component
--java.awt.Container
--javax.swing.JComponent
--javax.swing.JFileChooser
當我們在處理窗口上的一些操作,特別是文本處理的部份,例如一個(gè)文本編輯器上打了一段文字,我們可能希望將此段文字存儲起來(lái)
,供以后方便使用,此時(shí)系統應當提供一個(gè)存儲文件的對話(huà)框,將此段文字存到一個(gè)自定義或內定的文件名中.同樣,當我們要叫出某個(gè)
文件時(shí),系統也應當提供打開(kāi)文件的功能,讓我們選擇所欲打開(kāi)的文件.在java中這些操作都可以由JFileChoose組件來(lái)達成.這個(gè)組件
提供了打開(kāi)文件存盤(pán)的窗口功能,也提供了顯示特定類(lèi)型文件圖標的功能,亦能針對某些文件類(lèi)型做過(guò)濾的操作.如果你的系統需要對
某些文件或文件做操作,JFileChooser組件可以讓你輕松地做出漂亮的用戶(hù)界面.在這邊讀者要注意的是,JFileChooser本身不提供讀
文件或存盤(pán)的功能,這些功能必須你自行實(shí)作.事實(shí)上,JFileChooser本身只是一個(gè)對話(huà)框模型,它也是依附在JDialog的結構上,因此
它只是一個(gè)針對文件操作的對話(huà)框,當然本身也就不會(huì )有讀文件或存盤(pán)的功能!以下我們來(lái)看JFileChooser的構造函數:
JFileChooser構造函數:
JFileChooser():建立一個(gè)JFileChooser對象,默認的文件對話(huà)框路徑是用戶(hù)的家目錄(Home Directory),例如在windows 2000中的
Administrator的家目錄是在C:\Documents and Settings\Administrator中.
JFileChooser(File currentDirectory):建立一個(gè)JFileChooser對象,并以File所在位置文件為文件對話(huà)框的打開(kāi)路徑.
JFileChooser(File currentDirectory,FileSystemView fsv):建立一個(gè)JFileChooser對象,以File所在位置為文件對話(huà)框的打開(kāi)路
徑并設置文件圖標查看方式.
JFileChooser(FileSystemView fsv):建立一個(gè)JFileChooser對象,并設置文件圖標查看方式.
JFileChooser(String currentDirectoryPath):建立一個(gè)JFileChooser對象,并設置文件對話(huà)框的打開(kāi)路徑.
JFileChooser(String currentDirectoryPath,FileSystemView fsv): 建立一個(gè)JFileChooser對象,并設置文件對話(huà)框的打開(kāi)路徑與
文件圖標查看方式.
13-1-1:建立一個(gè)簡(jiǎn)單的JFileChooser對話(huà)框:
介紹完JFileChooser構造函數后,我們來(lái)實(shí)作一個(gè)簡(jiǎn)單的范例.這個(gè)范例可以讓用戶(hù)在JTextArea上輸入文字,輸入完后按下"存儲
文件"按鈕就可以打開(kāi)JFileChooser存儲文件對話(huà)框,用戶(hù)可以輸入欲存儲的文件名,按下"Save"按鈕就可以存儲文件.若用戶(hù)要打開(kāi)
某個(gè)文件內容,只需要按下"打開(kāi)文件"按鈕,就會(huì )出現JFileChooser打開(kāi)文件對話(huà)框,用戶(hù)選擇好所欲打開(kāi)的文件就可以將數據讀入
JTextArea中.
在這個(gè)范例中,我們使用JFileChooser的showOpenDialog()或showSaveDialog()方法來(lái)打開(kāi)文件對話(huà)框,此兩個(gè)方法在用戶(hù)按下
按鈕或關(guān)閉對話(huà)框時(shí)會(huì )返回一個(gè)整數值,這個(gè)整數值的類(lèi)型有3種,分別是:
JFileChooser.CANCEL_OPTION:表示用戶(hù)按下取消按鈕.
JFileChooser.APPROVE_OPTION:表示用戶(hù)按下確定按鈕.
JFileChooser.ERROR_OPEION:表示有錯誤產(chǎn)生或是對話(huà)框不正常關(guān)閉.
利用這3個(gè)整數值我們就能判斷用戶(hù)到底在對話(huà)框中做了什么操作,并加以處理,例如當用戶(hù)選擇了文件并按下確定鍵后,我們就可
以利用getSelectedFile()方法取得文件對象,利用這個(gè)文件對象我們就能夠取得文件名稱(chēng)(getName())與文件路徑(getPath());
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class FileChooserDemo1 implements ActionListener
{
JFrame f = null;
JLabel label = null;
JTextArea textarea = null;
JFileChooser fileChooser = null;
public FileChooserDemo1()
{
f = new JFrame("FileChooser Example");
Container contentPane = f.getContentPane();
textarea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(textarea);
scrollPane.setPreferredSize(new Dimension(350,300));
JPanel panel = new JPanel();
JButton b1 = new JButton("新建文件");
b1.addActionListener(this);
JButton b2 = new JButton("存儲文件");
b2.addActionListener(this);
panel.add(b1);
panel.add(b2);
label = new JLabel(" ",JLabel.CENTER);
fileChooser = new JFileChooser("D:\\");//建立一個(gè)FileChooser對象,并指定D:的目錄為默認文件對話(huà)框路徑.
contentPane.add(label,BorderLayout.NORTH);
contentPane.add(scrollPane,BorderLayout.CENTER);
contentPane.add(panel,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new FileChooserDemo1();
}
public void actionPerformed(ActionEvent e)
{
File file = null;
int result;
/*當用戶(hù)按下"打開(kāi)文件"按鈕時(shí),JFileChooser的showOpenDialog()方法會(huì )輸出文件對話(huà)框,并利用
*setApproveButtonText()方法取代按鈕上"Open"文字;以setDialogTitle()方法設置打開(kāi)文件對話(huà)框Title名稱(chēng).
*當使用選擇完后,會(huì )將選擇結果存到result變量中.
*/
if (e.getActionCommand().equals("新建文件"))
{
fileChooser.setApproveButtonText("確定");
fileChooser.setDialogTitle("打開(kāi)文件");
result = fileChooser.showOpenDialog(f);
textarea.setText("");
/*當用戶(hù)按下打開(kāi)文件對話(huà)框的"確定"鈕后,我們就可以利用getSelectedFile()方法取得文件對象.若是用戶(hù)按下打
*開(kāi)文件對話(huà)框的"Cancel"鈕,則將在label上顯示"你沒(méi)有選擇任何文件"字樣.
*/
if (result == JFileChooser.APPROVE_OPTION)
{
file = fileChooser.getSelectedFile();
label.setText("您選擇打開(kāi)的文件名稱(chēng)為:"+file.getName());
}
else if(result == JFileChooser.CANCEL_OPTION)
{
label.setText("您沒(méi)有選擇任何文件");
}
FileInputStream fileInStream = null;
if(file != null)
{
try{
//利用FileInputStream將文件內容放入此數據流中以便讀取.
fileInStream = new FileInputStream(file);
}catch(FileNotFoundException fe){
label.setText("File Not Found");
return;
}
int readbyte;
try{
//以read()方法讀取FileInputStream對象內容,當返回值為-1時(shí)代表讀完此數據流.將所讀到的字符顯示
//在textarea中.
while( (readbyte = fileInStream.read()) != -1)
{
textarea.append(String.valueOf((char)readbyte));
}
}catch(IOException ioe){
label.setText("讀取文件錯誤");
}
finally{//回收FileInputStream對象,避免資源的浪費.
try{
if(fileInStream != null)
fileInStream.close();
}catch(IOException ioe2){}
}
}
}
//實(shí)作寫(xiě)入文件的功能.
if (e.getActionCommand().equals("存儲文件"))
{
result = fileChooser.showSaveDialog(f);
file = null;
String fileName;
//當用戶(hù)沒(méi)有選擇文件,而是自己鍵入文件名稱(chēng)時(shí),系統會(huì )自動(dòng)以此文件名建立新文件.
if (result == JFileChooser.APPROVE_OPTION)
{
file = fileChooser.getSelectedFile();
label.setText("您選擇存儲的文件名稱(chēng)為:"+file.getName());
}
else if(result == JFileChooser.CANCEL_OPTION)
{
label.setText("您沒(méi)有選擇任何文件");
}
//寫(xiě)入文件我們使用FileOutputStream,在這個(gè)范例中,我們寫(xiě)入文件的方式是將之前內容清除并重新寫(xiě)入.若你想把
//新增的內容加在原有的文件內容后面,你可以使用FileOutputStream(String name,Boolean append)這個(gè)構造函數.
FileOutputStream fileOutStream = null;
if(file != null)
{
try{
fileOutStream = new FileOutputStream(file);
}catch(FileNotFoundException fe){
label.setText("File Not Found");
return;
}
String content = textarea.getText();
try{
fileOutStream.write(content.getBytes());
}catch(IOException ioe){
label.setText("寫(xiě)入文件錯誤");
}
finally{
try{
if(fileOutStream != null)
fileOutStream.close();
}catch(IOException ioe2){}
}
}
}
}
}
13-1-2:建立可選擇文件類(lèi)型的JFileChooser對話(huà)框:
當你專(zhuān)為某種文件類(lèi)型設計一套軟件時(shí),為了用戶(hù)打開(kāi)文件存盤(pán)方便,我們通常會(huì )在文件對話(huà)框中過(guò)濾掉無(wú)關(guān)的文件類(lèi)型,讓用戶(hù)
很快速選擇出想要的文件數據.例如在Word軟件中,當我們按下"另存新文件"選項時(shí),所出現的文件對話(huà)框將會(huì )以".doc"擴展名當作默
認的文件存儲類(lèi)型.
如果你所設計的軟件可以支持多種類(lèi)型的文件操作,你應該設計讓用戶(hù)可以選擇使用哪一種類(lèi)型的文件.
若你想在java的文件對話(huà)框中做到這樣的功能,你必須實(shí)現FileFilter這個(gè)抽象類(lèi).此抽象類(lèi)里面定義了兩個(gè)空的方法,分別是
accept(File f)與getDescripton().當目錄里的文件與設置的文件類(lèi)型相符時(shí),accept()方法就會(huì )返回true,并將此文件顯示在文件
對話(huà)框中.而getDescription()方法則是對此文件類(lèi)型的描述,可由程序設計者自定義,如"*.java"等等.要設置選擇文件類(lèi)型對話(huà)框
你可以使用JFileChooser的addChoosableFileFilter()方法或是setFileFilter()方法.下面這個(gè)例子我們實(shí)現FileFilter的功能,讓
用戶(hù)打開(kāi)文件時(shí)可以選擇顯示所有文件,或是*.java文件,亦或是*.class文件.
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.File;//由于我們在程序中要使用到File與FileFilter對象,因此要import File與FileFilter這兩個(gè)類(lèi).
import javax.swing.filechooser.FileFilter;
public class FileFilterDemo implements ActionListener{
JFrame f=null;
JLabel label=null;
JFileChooser fileChooser=null;
public FileFilterDemo(){
f=new JFrame("FileFilterDemo");
Container contentPane=f.getContentPane();
JButton b=new JButton("打開(kāi)文件");
b.addActionListener(this);
label=new JLabel(" ",JLabel.CENTER);
label.setPreferredSize(new Dimension(150,30));
contentPane.add(label,BorderLayout.CENTER);
contentPane.add(b,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
public static void main(String[] args){
new FileFilterDemo();
}
//處理用戶(hù)按下"打開(kāi)舊文件"按鈕事件.
public void actionPerformed(ActionEvent e){
fileChooser=new JFileChooser("C:\\winnt");//以c:\\winnt為打開(kāi)文件為對話(huà)框的默認路徑
//利用addChoosableFileFilter()方法加入欲過(guò)濾的文件類(lèi)型,使用addChoosableFileFilter()可以加入多種文件類(lèi)型,
//若你只需要過(guò)濾出一種文件類(lèi)型,可使用setFileFilter()方法.
fileChooser.addChoosableFileFilter(new JAVAFileFilter("class"));
fileChooser.addChoosableFileFilter(new JAVAFileFilter("java"));
int result=fileChooser.showOpenDialog(f);
if (result==JFileChooser.APPROVE_OPTION){
File file=fileChooser.getSelectedFile();
label.setText("你選擇了:"+file.getName()+"文件");
}else if (result==fileChooser.CANCEL_OPTION){
label.setText("你沒(méi)有選取文件");
}
}
}
//以JAVAFileFilter類(lèi)繼承FileFilter抽象類(lèi),并實(shí)現accept()與getDescription()方法.
class JAVAFileFilter extends FileFilter{
String ext;
public JAVAFileFilter(String ext){
this.ext=ext;
}
/*在accept()方法中,當程序所抓到的是一個(gè)目錄而不是文件時(shí),我們返回true值,表示將此目錄顯示出來(lái).*/
public boolean accept(File file){
if (file.isDirectory()){
return true;
}
String fileName=file.getName();
int index=fileName.lastIndexOf('.');
if (index>0 && index<fileName.length()-1){
//表示文件名稱(chēng)不為".xxx"現"xxx."之類(lèi)型
String extension=fileName.substring(index+1).toLowerCase();
//若所抓到的文件擴展名等于我們所設置要顯示的擴展名(即變量ext值),則返回true,表示將此文件顯示出來(lái),否則返回
//true.
if (extension.equals(ext))
return true;
}
return false;
}
//實(shí)現getDescription()方法,返回描述文件的說(shuō)明字符串!!!
public String getDescription(){
if (ext.equals("java"))
return "JAVA Source File(*.java)";
if (ext.equals("class"))
return "JAVA Class File(*.class)";
return "";
}
}
13-1-3:建立具有特殊文件類(lèi)型的圖標的JFileChooser:
在上個(gè)范例中,讀者可以發(fā)現若你選擇顯示所有文件時(shí),文件類(lèi)型圖標不會(huì )因擴展名的不同而有所區別,這樣可能造成用戶(hù)混淆
或是使用上的不方便.
要解決這個(gè)問(wèn)題,你必須再實(shí)現FileView這個(gè)抽象類(lèi),此抽象類(lèi)定義了5個(gè)空的方法,如下表所示:
FileView方法:
String getDescription(File f):返回對這個(gè)文件的描述,如這是一張風(fēng)景圖片等.
Icon getIcon(File f):返回文件Icon圖標.
String getName(File f):返回文件名.
String getTypeDescription(File f):返回文件類(lèi)型描述,如:"JAVA Source File"等等.
Boolean isTraversable(File f):返回目錄是否可瀏覽.
當你實(shí)現好這5個(gè)方法后,就可以利用JFileChooser的setFileView()方法來(lái)設置文件類(lèi)型圖標.我們來(lái)看下面的范例:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.File;
import javax.swing.filechooser.*;
public class FileIconFilterDemo implements ActionListener
{
JFrame f = null;
JLabel label = null;
JFileChooser fileChooser = null;
public FileIconFilterDemo()
{
f = new JFrame("FileIconFilter Demo");
Container contentPane = f.getContentPane();
JButton b = new JButton("打開(kāi)文件");
b.addActionListener(this);
label = new JLabel(" ",JLabel.CENTER);
label.setPreferredSize(new Dimension(150,30));
contentPane.add(label,BorderLayout.CENTER);
contentPane.add(b,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args)
{
new FileIconFilterDemo();
}
public void actionPerformed(ActionEvent e)
{
fileChooser = new JFileChooser("c:\\winnt");
fileChooser.addChoosableFileFilter(new JAVAFileFilter("class"));
fileChooser.addChoosableFileFilter(new JAVAFileFilter("java"));
fileChooser.setFileView(new FileIcon());
int result = fileChooser.showOpenDialog(f);
if(result == JFileChooser.APPROVE_OPTION)
{
File file = fileChooser.getSelectedFile();
label.setText("您選擇了:"+file.getName()+"文件");
}else if (result == fileChooser.CANCEL_OPTION){
label.setText("您沒(méi)有選擇任何文件");
}
}
}
class JAVAFileFilter extends FileFilter
{
String ext;
public JAVAFileFilter(String ext)
{
this.ext = ext;
}
public boolean accept(File file)
{
if (file.isDirectory())
return true;
String fileName = file.getName();
int index = fileName.lastIndexOf('.');
if (index > 0 && index < fileName.length()-1) {
String extension = fileName.substring(index+1).toLowerCase();
if (extension.equals(ext))
return true;
}
return false;
}
public String getDescription(){
if (ext.equals("java"))
return "JAVA Source File (*.java)";
if (ext.equals("class"))
return "JAVA Class File (*.class)";
return "";
}
}
class FileIcon extends FileView
{
public String getName(File f) {
return null; //返回值為null的話(huà),java look and feel功能會(huì )處理掉這個(gè)項目,并取得相關(guān)值來(lái)加以設置.
//一般而言可以使用f.getName()當返回值.
}
public String getDescription(File f) {
return null; //返回值為null的話(huà),java look and feel功能會(huì )處理掉這個(gè)項目,并取得相關(guān)值來(lái)加以設置.
//你也可以自己設置對此圖片的描素,如這是一張風(fēng)景圖片等等.
}
public String getTypeDescription(File f)
{
String extension = getExtensionName(f);
if(extension.equals("java"))
return "JAVA Source File";
if(extension.equals("class"))
return "JAVA Class File";
return "";
}
public Icon getIcon(File f)
{
String extension = getExtensionName(f);
if(extension.equals("java"))
return new ImageIcon("java.gif");
if(extension.equals("class"))
return new ImageIcon("class.gif");
return null;
}
public Boolean isTraversable(File f) {
return null; //返回值為null的話(huà),java look and feel功能會(huì )處理掉這個(gè)項目,并取得相關(guān)值來(lái)加以設置.
//若佻不希望某個(gè)目錄被瀏覽,則返回值可以設為Boolean.FALSE.
}
public String getExtensionName(File f)//在FileIcon類(lèi)中我們增加一個(gè)getExtensionName()方法,用來(lái)返回文件的擴展名
{ //名稱(chēng).
String extension ="";
String fileName = f.getName();
int index = fileName.lastIndexOf('.');
if (index > 0 && index < fileName.length()-1) {
extension = fileName.substring(index+1).toLowerCase();
}
return extension;
}
}
13-2:建立顏色選擇對話(huà)框(JColorChooer):
JColorChooer的類(lèi)層次結構圖:
java.lang.Object
--java.awt.Component
--java.awt.Container
--javax.swing.JComponent
--javax.swing.JColorChooser
Color Chooser可以讓你選擇所想要的顏色,并更改某個(gè)組件的顏色.例如在小畫(huà)家中,你可以在畫(huà)板上畫(huà)上圖案,并選擇各式各樣
的顏色來(lái)加以裝飾;至于顏色的選擇上,你可以在小畫(huà)家中找到顏色選擇對話(huà)框.
JColorChooser構造函數:
JColorChooser():建立一個(gè)JColorChooer對象,默認顏色為白色.
JColorChooser(Color initialColor):建立一個(gè)JColorChooer對象,并設置初始顏色.
JColorChooser(ColorSelectionModel modal):以ColorSelectionModel構造JColorChooser對象.
13-2-1:輕松輸出顏色選擇對話(huà)框:
最常使用JColorChooser的方式是使用JColorChooser的靜態(tài)方法showDialog().也就是說(shuō)在大部份的情況下,我們不會(huì )new一個(gè)
JColorChooser對象,而是直接使用JColorChooser的靜態(tài)方法(showDialog())來(lái)輸出顏色選擇對話(huà)框.利用這個(gè)方法我們亦可以得到
用戶(hù)所選擇的顏色,若用戶(hù)沒(méi)有選擇則返回null值.
另外還有一個(gè)使用JColorChooser常用的方式,那就是使用createDialog()靜態(tài)方法.使用這個(gè)靜態(tài)方法后會(huì )得到一個(gè)JDialog對
象,我們可以利用這個(gè)JDialog對象對顏色選擇對話(huà)框做更多的設置.不過(guò)利用這個(gè)方法必須配合JColorChooser對象才行,也就是必須
new出一個(gè)JColorChooser對象來(lái).下面范例我們先介紹第一種最簡(jiǎn)單的也是最實(shí)用的JColorChooser選擇顏色完畢后就能更改JLabel
上的背景顏色.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import com.incors.plaf.alloy.*;
import com.incors.plaf.alloy.themes.glass.*;
public class ColorChooserDemo1 extends MouseAdapter
{
JFrame f = null;
JLabel label = null;
JLabel label1 = null;
JLabel label2 = null;
Rectangle rec1 = null;
Rectangle rec2 = null;
public ColorChooserDemo1()
{
f = new JFrame("ColorChooser Example");
Container contentPane = f.getContentPane();
contentPane.addMouseListener(this);
label = new JLabel(" ",JLabel.CENTER);
label.setPreferredSize(new Dimension(300,20));
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1,2));
label1 = new JLabel("左Label",JLabel.CENTER);
label1.setBackground(Color.red);
label1.setForeground(Color.black);
label1.setOpaque(true);
label1.setBounds(0, 0, 150, 150);
panel.add(label1);
label2 = new JLabel("右Label",JLabel.CENTER);
label2.setBackground(Color.green);
label2.setForeground(Color.black);
label2.setOpaque(true);
label2.setBounds(150, 0, 150, 150);
panel.add(label2);
rec1 = label1.getBounds();
rec2 = label2.getBounds();
contentPane.add(panel,BorderLayout.CENTER);
contentPane.add(label,BorderLayout.SOUTH);
f.setSize(new Dimension(300,150));
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] arg)
{
SwingUtil.setLookAndFeel();
new ColorChooserDemo1();
}
//實(shí)現MouseAdapter中的mousePressed()與mouseClicked()方法.當按下鼠標時(shí),就能知道鼠標光標目前的位置.當連續鍵擊鼠標
//兩次時(shí),若光標所在位置在label中,就會(huì )出現顏色選擇對話(huà)框,用戶(hù)可選擇任一顏色更改label的顏色.
public void mousePressed(MouseEvent e) {
label.setText("目前鼠標坐標(X,Y)為:("+e.getX()+","+e.getY()+")");
}
public void mouseClicked(MouseEvent e)
{
Point point = e.getPoint();
if (e.getClickCount() ==2)
{
if(rec1.contains(point))
{ /*利用JColorChooser的showDialog()靜態(tài)方法輸出顏色選擇對話(huà)框,showDialog()中的3個(gè)參數依次是:
*對話(huà)框的父組件,顏色選擇對話(huà)框標題,與對話(huà)框默認顏色.當用戶(hù)選擇完顏色之后,按下"OK"按鈕則返回
*Color對象,若按下"Cancel"按鈕則返回null值.
*/
Color color = JColorChooser.showDialog(
f,"Change label1 Color",Color.white);
if (color != null) //若為null值表示用戶(hù)按下Cancel按鈕
label1.setBackground(color);
}
if(rec2.contains(point))
{
Color color = JColorChooser.showDialog(
f,"Change label2 Color",Color.yellow);
if (color != null) //若為null值表示用戶(hù)按下Cancel按鈕
label2.setBackground(color);
}
}
}
}
class SwingUtil{
public static final void setLookAndFeel() {
try{
Font font = new Font("JFrame", Font.PLAIN, 12);
Enumeration keys = UIManager.getLookAndFeelDefaults().keys();
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
if (UIManager.get(key) instanceof Font) {
UIManager.put(key, font);
}
}
AlloyLookAndFeel.setProperty("alloy.isLookAndFeelFrameDecoration", "true");
AlloyTheme theme = new GlassTheme();
LookAndFeel alloyLnF = new AlloyLookAndFeel(theme);
UIManager.setLookAndFeel(alloyLnF);
}catch(UnsupportedLookAndFeelException ex){
ex.printStackTrace();
}
}
}
13-2-2:建立JColorChooser對象輸出顏色選擇對話(huà)框:
接下來(lái)我們介紹剛剛所提到使用JColorChooser的第二種方式,也就是使用createDialog()靜態(tài)方法來(lái)輸出顏色選擇對話(huà)框.使
用這種方式的好處是顏色選擇對話(huà)框可以做出多樣性的變化,例如你可以使用JDialog中的setMenuBar()方法在顏色選擇對話(huà)框中加
入菜單欄,或是利用JDialog的getContentPane()方法取得JDialog的ContentPane,然后對此ContentPane來(lái)做處理.下面范例我們修改
上個(gè)范例程序,并利用createDialog()方式來(lái)輸出JColorChooser:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ColorChooserDemo2 extends MouseAdapter implements ActionListener
{
JFrame f = null;
JLabel label = null;
JLabel label1 = null;
JLabel label2 = null;
Rectangle rec1 = null;
Rectangle rec2 = null;
JDialog dialog = null;
JColorChooser colorChooser = null;
public ColorChooserDemo2()
{
f = new JFrame("ColorChooser Example");
Container contentPane = f.getContentPane();
contentPane.addMouseListener(this);
label = new JLabel(" ",JLabel.CENTER);
label.setPreferredSize(new Dimension(300,20));
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1,2));
label1 = new JLabel("左Label",JLabel.CENTER);
label1.setBackground(Color.red);
label1.setForeground(Color.black);
label1.setOpaque(true);
label1.setBounds(0, 0, 150, 150);
panel.add(label1);
label2 = new JLabel("右Label",JLabel.CENTER);
label2.setBackground(Color.green);
label2.setForeground(Color.black);
label2.setOpaque(true);
label2.setBounds(150, 0, 150, 150);
panel.add(label2);
rec1 = label1.getBounds();
rec2 = label2.getBounds();
contentPane.add(panel,BorderLayout.CENTER);
contentPane.add(label,BorderLayout.SOUTH);
//建立一個(gè)新的JColorChooser對象,默認顏色為白色.
colorChooser = new JColorChooser();
/*利用JColorChooser的createDialog()靜態(tài)方法取得JDialog對象,createDialog()方法的最后兩個(gè)參數是用來(lái)處理顏色
*選擇對話(huà)框的"OK"與"Cancel"鍵的ActionEvent事件.讀者可發(fā)現,這邊并沒(méi)有對顏色選擇對話(huà)框的"Reset"做處理,因為
*內部系統會(huì )自動(dòng)處理此事件,如此可減輕程序設計師的負擔.
*/
dialog = colorChooser.createDialog(f, //parent component
"Change Color", //title
true, //modal
colorChooser, //JColorChooser
this,//okListenr
this);//cancelListener
f.setSize(new Dimension(300,150));
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] arg)
{
new ColorChooserDemo2();
}
public void mousePressed(MouseEvent e) {
label.setText("目前鼠標坐標(X,Y)為:("+e.getX()+","+e.getY()+")");
}
boolean flag = true;
public void mouseClicked(MouseEvent e)
{
Point point = e.getPoint();
//判斷Double Click鼠標時(shí)的所在位置,若在label1或label2上則設置對話(huà)框的Title,并用show()方法將此對話(huà)框顯示出來(lái).
if (e.getClickCount() ==2)
{
if(rec1.contains(point))
{
flag = true;
dialog.setTitle("Change label1 Color");
dialog.show();
}
if(rec2.contains(point))
{
flag = false;
dialog.setTitle("Change label2 Color");
dialog.show();
}
}
}
/*處理用戶(hù)對顏色選擇對話(huà)框中的按鈕事件.當用戶(hù)按下"OK"鍵時(shí),便將label的背景顏色改變成用戶(hù)所選擇的顏色.當用戶(hù)
*按下"Cancel"鍵時(shí),則會(huì )用Dialog類(lèi)所提供的dispose()方法就可以關(guān)閉顏色選擇對話(huà)框了.
*/
public void actionPerformed(ActionEvent ae)
{
if(ae.getActionCommand().equals("OK"))
{
if (flag == true)
label1.setBackground(colorChooser.getColor());
else
label2.setBackground(colorChooser.getColor());
}
if(ae.getActionCommand().equals("Cancel"))
dialog.dispose();
}
}
13-2-3:將JColorChooser置于一般容器中顯示.
我們剛剛所講的JColorChooser都是以對話(huà)框的形式出現.事實(shí)上JColorChooser可以置于一般的java容器上,不過(guò)這時(shí)候你就必
須實(shí)際構造出JColorChooser對象,并使用ColorSelectionModel來(lái)管理用戶(hù)所選擇的顏色.ColorSelectionModel本身是個(gè)interface
.里面定義一些用戶(hù)選擇顏色或設置顏色的方法,并有addChangeListener()方法來(lái)檢測用戶(hù)是否改變了顏色的選擇.要使用到
ColorSelectionModel Interface所定義的方法,理論上我們必須實(shí)現它,然而java本身可利用JColorChooser所提供的
getSelectionModel()方法得到ColorSelectionModel的實(shí)體.這時(shí)候就可以直接以ColorSelectionModel的addChangeListener()方法
來(lái)檢測用戶(hù)是否對顏色的選擇有所改變,而不需要再另外實(shí)現這些方法.
每當用戶(hù)JColorChooser上做一次顏色的改變時(shí),就會(huì )觸發(fā)ChangeEvent事件,因此我們必須實(shí)現ChangeListener界面來(lái)處理這個(gè)
事件.此界面只定義了一個(gè)方法,那就是stateChanged().下面范例我們將JColorChooser放在JPanel上,并在label上輸出用戶(hù)所選擇
的顏色與顏色參數.
import java.awt.*;
import java.awt.event.*;//ChangeEvent是Swing的事件,因此我們必須將Swing的event package import進(jìn)來(lái).
import javax.swing.*;
import javax.swing.colorchooser.*;
import javax.swing.event.*;
public class ColorChooserDemo3 implements ChangeListener
{
JFrame f = null;
JLabel label = null;
JColorChooser colorChooser = null;
public ColorChooserDemo3()
{
f = new JFrame("ColorChooser Example");
Container contentPane = f.getContentPane();
label = new JLabel(" ",JLabel.CENTER);
//設定label背景顏色為不透明,這樣才可以將label的背景顏色顯示出來(lái)
label.setOpaque(true);
//設定label上字體的顏色,也就是label的前景顏色
label.setForeground(Color.black);
JPanel panel = new JPanel();
/*建立一個(gè)JColorChooser對象,并以getSelectionModel()方法取得ColorSelectionModel實(shí)體,并在這個(gè)實(shí)體上以
*addChangeListener()方法檢測用戶(hù)是否有改變顏色.
*/
colorChooser = new JColorChooser();
/****add code***/
//此處為下面"13-2-4中所要加代碼的區塊"
/****add code***/
panel.add(colorChooser);
ColorSelectionModel selectModel =
colorChooser.getSelectionModel();
selectModel.addChangeListener(this);
contentPane.add(label,BorderLayout.NORTH);
contentPane.add(panel,BorderLayout.CENTER);
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] arg)
{
new ColorChooserDemo3();
}
//實(shí)現ChangeListener Interface,stateChanged()方法是在處理ChangeEvent事件.當用戶(hù)改變顏色的選擇時(shí),我們就在label
//輸出用戶(hù)所選擇的顏色,并顯示顏色參數.
public void stateChanged(ChangeEvent e)
{
Color color = colorChooser.getColor();
label.setBackground(color);
label.setText("您選擇的顏色參數為:R:"+color.getRed()+
" G:"+color.getGreen()+" B:"+color.getBlue());
}
}
13-2-4:改變JColorChooser的顏色選擇面版.
在以前我們曾經(jīng)提到JColorChooser提供3種面版讓我們選擇,分別"Swatches","HSB"與"RGB".這3個(gè)面版是java已經(jīng)構造好的顏
色面版,如果佻要自行產(chǎn)生自己所設計的顏色面版,你可以繼承AbstractColorChooserPanel這個(gè)抽象類(lèi),并實(shí)現里面的抽象方法,這個(gè)
抽象類(lèi)位于javax.swing.colorchooser這個(gè)package中.當你實(shí)現完成之后,你可以使用JColorChooser類(lèi)提供的addChooserPanel()
方法,或是setChooserPanels()方法,將你所設計的顏色面版增加到上圖的顏色顯示面版中.
若你想刪除某一個(gè)顏色面版模式,你可以先使用JColorChooser類(lèi)所提供的getChooserPanels()方法,得到類(lèi)型為
AbstractColorChooserPanel的Array Object.例如在上例中運行所示,"Swatches"就會(huì )放在此類(lèi)型的Array[0]中,面"HSB"會(huì )放在
Array[1]中,以此類(lèi)推.得到此Array Object之后,我們就可以利用JColorChooser類(lèi)提供的removeChooserPanel()方法.決定刪除一個(gè)
顏色面版.例如我們若要刪除上例運行所示的"HSB"面版,我們可以在上面范例/****add code***/里面增加這2行程序:
AbstractColorChooserPanel[] colorPanel=colorChooser.getChooserPanels();
colorChooser.removeChooserPanel(colorPanel[1]);
13-3:建立分隔線(xiàn)(JSeparator):
JSeparator)的類(lèi)層次結構圖:
java.lang.Object
--java.awt.Component
--java.awt.Container
--javax.swing.JComponent
--javax.swing.JSeparator
JSeparator通常用在菜單(Menu)或工具欄(ToolBar)上,可以明顯地分格出不同的功能區域.在JMenu或JPopupMenu中我們可以使用
addSeparator()方法輕易的加入分隔線(xiàn),但若是在一般的面版中呢?這時(shí)候我們必須自行建立JSeparator對象,然后再依照自己所需將
分隔線(xiàn)放在所想要的位置上.JSeparator有水平與垂直兩種,建立的方式非常簡(jiǎn)單,我們來(lái)看看JSeparator的構造函數:
JSeparator構造函數:
JSeparator():建立水平的JSeparator組件.
JSeparator(int orientation):建立水平或垂直的JSeparator組件.
JSeparator類(lèi)所提供的方法跟其他Swing組件比較起來(lái)算是少了許多,因為分隔線(xiàn)本身并沒(méi)有什么功能可言,主要是設置分隔線(xiàn)的方
向,其他如分隔線(xiàn)的長(cháng)短或設置位置方法,都可以在它的父類(lèi)JComponent中找到.下面我們來(lái)看如何使用JSeparator,并顯示水平與垂
直分隔線(xiàn)的外觀(guān).
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SeparatorDemo1
{
JFrame f = null;
public SeparatorDemo1()
{
f = new JFrame("Separator Example");
Container contentPane = f.getContentPane();
contentPane.setLayout(new BorderLayout(1,2));
JPanel panel1 = new JPanel(new GridLayout(2,1));
JLabel label = new JLabel("水平分隔線(xiàn)",JLabel.CENTER);
JSeparator seph = new JSeparator();
panel1.add(label);
panel1.add(seph);
JTextArea textarea = new JTextArea();
textarea.setPreferredSize(new Dimension(150,100));
JPanel panel2 = new JPanel(new BorderLayout());
panel2.add(panel1,BorderLayout.NORTH);
panel2.add(textarea,BorderLayout.CENTER);
JPanel panel3 = new JPanel(new GridLayout(1,3));
label = new JLabel("垂直");
label.setVerticalAlignment(JLabel.CENTER);
panel3.add(label);
JSeparator sepv = new JSeparator();
sepv.setOrientation(JSeparator.VERTICAL);
panel3.add(sepv);
contentPane.add(panel2,BorderLayout.CENTER);
contentPane.add(panel3,BorderLayout.EAST);
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] arg)
{
new SeparatorDemo1();
}
}
Made by e-Stack Room
http://www.mycnknow.com
來(lái)自:http://www.itbbs.cn/ShowPost.Asp?ID=1107
聯(lián)系客服