?? sample26_7.java
字號(hào):
package wyf.jc;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
//自定義的表格數(shù)據(jù)模型
class MyTableModel extends AbstractTableModel
{
//創(chuàng)建表示各個(gè)列類型的類型數(shù)組
Class[] colClass={String.class,Number.class,Date.class};
//創(chuàng)建列標(biāo)題字符串?dāng)?shù)組
Object[] head={"字符串","數(shù)值","日期"};
//創(chuàng)建表示表格數(shù)據(jù)的二維對(duì)象數(shù)組
Object[][] data={{"one",new Integer(70),new Date()},
{"two",new Integer(30),new Date(105,7,1)},
{"three",new Integer(70),new Date(107,8,1)},
{"four",new Integer(30),new Date(106,0,1)},
{"five",new Integer(50),new Date(107,1,1)},
{"six",new Integer(50),new Date(107,8,2)},
{"seven",new Integer(50),new Date(106,9,1)},
{"eight",new Integer(60),new Date(107,5,1)},
{"nine",new Integer(90),new Date(106,7,1)},
{"ten",new Integer(60),new Date(107,11,1)},
{"eleven",new Integer(60),new Date(105,4,1)}};
//重寫getColumnCount方法
public int getColumnCount()
{
return head.length;
}
//重寫getRowCount方法
public int getRowCount()
{
return data.length;
}
//重寫getColumnName方法
public String getColumnName(int col)
{
return head[col].toString();
}
//重寫getValueAt方法
public Object getValueAt(int r,int c)
{
return data[r][c];
}
//重寫getColumnClass方法
public Class getColumnClass(int c)
{
return colClass[c];
}
}
//自定義的過濾條件獲取控件面板
class MyFilterPane extends JPanel implements ItemListener
{
//定義標(biāo)識(shí)面板的字符串
String snd;
//創(chuàng)建一個(gè)復(fù)選框
JCheckBox jcb=new JCheckBox();
//創(chuàng)建兩個(gè)標(biāo)簽控件
JLabel jl1=new JLabel();
JLabel jl2=new JLabel("設(shè)置該條件與其他條件的關(guān)系");
//創(chuàng)建一個(gè)文本框控件
JTextField jtf=new JTextField();
//創(chuàng)建一個(gè)單選按扭數(shù)組,并為該單選按扭數(shù)組中的單選按扭創(chuàng)建一個(gè)按扭組
JRadioButton[] jrb={new JRadioButton("與關(guān)系",true),new JRadioButton("或關(guān)系")};
ButtonGroup bg=new ButtonGroup();
public MyFilterPane(String snd)
{
//設(shè)置面板的布局管理器
this.setLayout(null);
//設(shè)置標(biāo)識(shí)字符串
this.snd=snd;
//設(shè)置復(fù)選框的文本、大小位置并為其注冊(cè)監(jiān)聽器,同時(shí)將其添加到面板中
jcb.setText("設(shè)置"+snd+"過濾條件");
jcb.addItemListener(this);
jcb.setBounds(5,5,150,26);
this.add(jcb);
//設(shè)置jl1標(biāo)簽的文本以及大小位置,并將其添加到面板中
jl1.setText("請(qǐng)輸入與"+snd+"匹配的值");
jl1.setBounds(10,30,150,26);
this.add(jl1);
//設(shè)置文本框的大小位置以及可編輯性,并將其添加到面板中
jtf.setBounds(160,30,80,26);
jtf.setEditable(false);
this.add(jtf);
//設(shè)置jl2標(biāo)簽的大小位置,并將其添加到面板中
jl2.setBounds(10,60,200,26);
this.add(jl2);
//循環(huán)對(duì)單選按鈕數(shù)組進(jìn)行設(shè)置
for(int i=0;i<jrb.length;i++)
{
//設(shè)置單選按扭的大小位置、可編輯性并且將其添加進(jìn)按扭組與面板中
jrb[i].setBounds(10+i*80,80,80,26);
jrb[i].setEnabled(false);
bg.add(jrb[i]);
this.add(jrb[i]);
}
}
//獲取各個(gè)面板中條件對(duì)應(yīng)過濾器的方法
public RowFilter getFilter()
{
if(jcb.isSelected())
{//測(cè)試復(fù)選框是否選中
if(snd.equals("字符串"))
{//測(cè)試標(biāo)識(shí)字符串進(jìn)而確定是否是字符串過濾條件的面板
//將輸入的字符串封裝成過濾器返回 該過濾器將針對(duì)表中第一列進(jìn)行過濾
return RowFilter.regexFilter(jtf.getText().trim(),0);
}
else if(snd.equals("數(shù)值"))
{//測(cè)試標(biāo)識(shí)字符串進(jìn)而確定是否是數(shù)值過濾條件的面板
//獲取輸入的字符串
String str=jtf.getText().trim();
//測(cè)試輸入的是否是整數(shù)
if(!str.matches("[0-9]+"))
{//若不是整數(shù)則返回
return null;
}
//將字符串封裝成Integer對(duì)象
Integer i=new Integer(str);
//根據(jù)Integer對(duì)象封裝進(jìn)過濾器,該過濾器將針對(duì)表中第二列進(jìn)行過濾
return RowFilter.numberFilter(RowFilter.ComparisonType.EQUAL,i,1);
}
else if(snd.equals("日期"))
{//測(cè)試標(biāo)識(shí)字符串進(jìn)而確定是否是日期過濾條件的面板
//獲取輸入的字符串
String str=jtf.getText().trim();
try
{
//將字符串解析成日期Date對(duì)象
String[] tempsa=str.split("-");
Date d=new Date(Integer.parseInt(tempsa[0])-1900,
Integer.parseInt(tempsa[1])-1,Integer.parseInt(tempsa[2]));
//根據(jù)日期對(duì)象創(chuàng)建過濾器,該過濾器將針對(duì)表中第三列進(jìn)行過濾
return RowFilter.dateFilter(RowFilter.ComparisonType.EQUAL,d,2);
}
catch(Exception e)
{
//若輸入字符串不能解析成功將彈出提示框
JOptionPane.showMessageDialog(this,
"格式錯(cuò)誤,例如應(yīng)為“2007-3-5”或“2006-12-30”!!!");
return null;
}
}
}
return null;
}
//實(shí)現(xiàn)ItemListener接口中的方法
public void itemStateChanged(ItemEvent e)
{
if(e.getSource()==jcb&&jcb.isSelected())
{//當(dāng)復(fù)選框選中時(shí)設(shè)置所有控件的可用性
this.setIsOpen(true);
}
else if(e.getSource()==jcb&&!jcb.isSelected())
{//當(dāng)復(fù)選框未選中時(shí)設(shè)置所有控件的可用性
this.setIsOpen(false);
}
}
//設(shè)置控件可用性的方法
public void setIsOpen(boolean b)
{
//根據(jù)參數(shù)設(shè)置各個(gè)控件的可用性
jtf.setEditable(b);
jrb[0].setEnabled(b);
jrb[1].setEnabled(b);
}
}
//主類
public class Sample26_7 extends JFrame
{
//創(chuàng)建自定義的表格模型對(duì)象
MyTableModel mtm=new MyTableModel();
//根據(jù)模型創(chuàng)建表格控件
JTable jt=new JTable(mtm);
//將表格控件放到滾動(dòng)窗體中
JScrollPane jsp=new JScrollPane(jt);
//創(chuàng)建表格的行排序器
TableRowSorter sorter = new TableRowSorter(mtm);
//創(chuàng)建選項(xiàng)卡窗格
JTabbedPane jtp=new JTabbedPane();
//為三個(gè)列創(chuàng)建3個(gè)不同的面板
MyFilterPane mfpStr=new MyFilterPane("字符串");
MyFilterPane mfpNum=new MyFilterPane("數(shù)值");
MyFilterPane mfpDate=new MyFilterPane("日期");
//存放與條件過濾器的列表
ArrayList andlist=new ArrayList();
//存放或條件過濾器的列表
ArrayList orlist=new ArrayList();
//創(chuàng)建一個(gè)按扭
JButton jb=new JButton("提交");
public Sample26_7()
{
//設(shè)置窗體容器為空布局
this.setLayout(null);
//設(shè)置包含表格的滾動(dòng)窗體的大小位置
jsp.setBounds(10,10,300,180);
//將滾動(dòng)窗體添加進(jìn)窗體
this.add(jsp);
//將3個(gè)面板添加到選項(xiàng)卡窗格中
jtp.addTab("過濾字符串",mfpStr);
jtp.addTab("過濾數(shù)值",mfpNum);
jtp.addTab("過濾日期",mfpDate);
//設(shè)置選項(xiàng)卡窗格的大小位置,并將選項(xiàng)卡窗格添加到窗體中
jtp.setBounds(320,10,260,150);
this.add(jtp);
//設(shè)置按扭的大小位置
jb.setBounds(400,170,120,26);
//通過匿名內(nèi)部類為按扭注冊(cè)監(jiān)聽器并編寫事件處理代碼
jb.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==jb)
{
Sample26_7.this.creatGeneralFilter();
}
}
});
//將按扭添加進(jìn)窗體
this.add(jb);
//為表格設(shè)置行排序器
jt.setRowSorter(sorter);
//設(shè)置窗體標(biāo)題、大小位置以及可見性
this.setTitle("表格排序器與過濾器示例");
this.setResizable(false);
this.setBounds(100,100,600,230);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//獲取最后組裝的過濾器的方法
public void creatGeneralFilter()
{
//獲取字符串過濾面板的過濾器
RowFilter rf=mfpStr.getFilter();
if(rf!=null)
{//測(cè)試獲取的過濾器是否為null
if(mfpStr.jrb[0].isSelected())
{//測(cè)試字符串面板中單選按扭是否選擇的是與關(guān)系,若是則將過濾器添加進(jìn)與列表
andlist.add(rf);
}
else
{//否則將過濾器添加進(jìn)或列表
orlist.add(rf);
}
}
//獲取數(shù)值過濾面板的過濾器
rf=mfpNum.getFilter();
if(rf!=null)
{//測(cè)試獲取的過濾器是否為null
if(mfpNum.jrb[0].isSelected())
{//測(cè)試數(shù)值面板中單選按扭是否選擇的是與關(guān)系,若是則將過濾器添加進(jìn)與列表
andlist.add(rf);
}
else
{//否則將過濾器添加進(jìn)或列表
orlist.add(rf);
}
}
//獲取日期過濾面板的過濾器
rf=mfpDate.getFilter();
if(rf!=null)
{//測(cè)試獲取的過濾器是否為null
if(mfpDate.jrb[0].isSelected())
{//測(cè)試日期面板中單選按扭是否選擇的是與關(guān)系,若是則將過濾器添加進(jìn)與列表
andlist.add(rf);
}
else
{//否則將過濾器添加進(jìn)或列表
orlist.add(rf);
}
}
if(!andlist.isEmpty())
{//測(cè)試與列表中是否沒有元素,若有元素則將該列表中的過濾器根據(jù)與條件進(jìn)行組裝
rf=RowFilter.andFilter(andlist);
//將組裝后的過濾器添加進(jìn)或關(guān)系列表中
orlist.add(rf);
}
if(!orlist.isEmpty())
{//測(cè)試或列表中是否沒有元素,若有元素則將該列表中的過濾器根據(jù)或條件進(jìn)行組裝
rf=RowFilter.orFilter(orlist);
}
//將最后組裝好的過濾器設(shè)置到表格排序器中進(jìn)而體現(xiàn)在表格中
sorter.setRowFilter(rf);
//清除與列表與或列表中的所有元素
andlist.clear();
orlist.clear();
}
public static void main(String args[])
{
//創(chuàng)建Sample26_7窗體對(duì)象
new Sample26_7();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -