Skip to content

Commit 52bc6b5

Browse files
committed
Java Swing Table with search fields
1 parent b9913e3 commit 52bc6b5

File tree

10 files changed

+360
-0
lines changed

10 files changed

+360
-0
lines changed

javaswingtable/App.class

1.39 KB
Binary file not shown.

javaswingtable/App.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import java.util.*;
2+
import javax.swing.*;
3+
import java.awt.*;
4+
import java.awt.event.*;
5+
6+
public class App extends JFrame{
7+
private JPanel tablePanel;
8+
private JTable table;
9+
public App(){
10+
11+
initUI();
12+
}
13+
private void initUI(){
14+
Object test[][] = new Object[5][2];
15+
test[0][0] = "Peter";
16+
test[0][1] = 19;
17+
test[1][0] = "Charles";
18+
test[1][1] = 35;
19+
test[2][0] = "Eduard";
20+
test[2][1] = 13;
21+
test[3][0] = "Leo";
22+
test[3][1] = 15;
23+
test[4][0] = "Nick";
24+
test[4][1] = 9;
25+
String titles[] = {"Name","Age"};
26+
table = new FTable(test,titles);
27+
tablePanel = new TablePanel(table);
28+
29+
setContentPane(tablePanel);
30+
setTitle("Table use example");
31+
pack();
32+
//setResizable(false);
33+
setSize(800,500);
34+
setMinimumSize(new Dimension(800,500));
35+
36+
setLocationRelativeTo(null);
37+
38+
setDefaultCloseOperation(EXIT_ON_CLOSE);
39+
40+
// setVisible(true);
41+
}
42+
43+
public static void main(String args[]){
44+
App app = new App();
45+
app.setVisible(true);
46+
}
47+
}
484 Bytes
Binary file not shown.

javaswingtable/FTable.class

2.29 KB
Binary file not shown.

javaswingtable/FTable.java

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
2+
3+
4+
import javax.swing.event.TableColumnModelEvent;
5+
import javax.swing.JTable;
6+
import javax.swing.table.*;
7+
import javax.swing.border.*;
8+
import java.awt.Color;
9+
import java.awt.event.*;
10+
import java.util.List;
11+
import java.util.ArrayList;
12+
import javax.swing.RowFilter;
13+
14+
//
15+
import java.awt.Component;
16+
import java.util.Calendar;
17+
import java.util.Date;
18+
import java.text.SimpleDateFormat;
19+
20+
//
21+
public class FTable extends JTable{
22+
23+
private TableRowSorter<TableModel> sorter;
24+
private List<RowFilter<Object,Object>> sortList;
25+
26+
private class ModdedTable extends DefaultTableModel{
27+
public ModdedTable(Object[][] rows, String[] columns){
28+
super(rows,columns);
29+
}
30+
31+
@Override
32+
public boolean isCellEditable(int row, int column){
33+
return false;
34+
}
35+
}
36+
37+
38+
public FTable(Object[][] rows, String columns[]){
39+
40+
41+
setModel(new ModdedTable(rows,columns));
42+
sorter = new TableRowSorter<>(getModel());
43+
setRowSorter(sorter);
44+
setBorder(new EtchedBorder(EtchedBorder.RAISED));
45+
setGridColor(Color.BLACK);
46+
setFillsViewportHeight(true);
47+
sortList = new ArrayList<RowFilter<Object,Object>>();
48+
}
49+
50+
public FTable(TableModel model){
51+
52+
setModel(model);
53+
sorter = new TableRowSorter<>(getModel());
54+
setRowSorter(sorter);
55+
setBorder(new EtchedBorder(EtchedBorder.RAISED));
56+
setGridColor(Color.BLACK);
57+
setFillsViewportHeight(true);
58+
sortList = new ArrayList<RowFilter<Object,Object>>();
59+
60+
}
61+
62+
63+
public void addToSortList(RowFilter<Object,Object> row){
64+
sortList.add(row);
65+
}
66+
67+
public void setSortList(List<RowFilter<Object,Object>> sortList){
68+
this.sortList = sortList;
69+
}
70+
71+
public List<RowFilter<Object,Object>> setSortList(){
72+
return sortList;
73+
}
74+
75+
//OBS:
76+
//Postion and column must be the same
77+
78+
public void updateSortList(int column, String text){
79+
sortList.set(column,RowFilter.regexFilter(text,column));
80+
81+
sorter.setRowFilter(RowFilter.andFilter(sortList));
82+
}
83+
84+
85+
86+
87+
88+
89+
90+
}

javaswingtable/TablePanel$1.class

783 Bytes
Binary file not shown.

javaswingtable/TablePanel$2.class

634 Bytes
Binary file not shown.
1.03 KB
Binary file not shown.

javaswingtable/TablePanel.class

5.51 KB
Binary file not shown.

javaswingtable/TablePanel.java

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
import java.text.ParseException;
2+
import java.awt.Component;
3+
import java.util.Calendar;
4+
import java.util.Date;
5+
import java.text.SimpleDateFormat;
6+
import java.text.DateFormat;
7+
import javax.swing.JPanel;
8+
import java.util.Map;
9+
import java.util.HashMap;
10+
import javax.swing.JTable;
11+
import javax.swing.table.*;
12+
import javax.swing.JCheckBox;
13+
import javax.swing.JTextField;
14+
import javax.swing.JComponent;
15+
import java.awt.event.*;
16+
import javax.swing.event.*;
17+
import java.util.List;
18+
import java.util.ArrayList;
19+
import javax.swing.RowFilter;
20+
import java.awt.Container;
21+
import java.awt.BorderLayout;
22+
import javax.swing.BoxLayout;
23+
import java.awt.FlowLayout;
24+
import javax.swing.JScrollPane;
25+
public class TablePanel extends JPanel{
26+
private JPanel filters;
27+
private JCheckBox sensitive[];
28+
private JTable table;
29+
private JTextField queryFields[];
30+
private JTextField secondDateFields[];
31+
private List<RowFilter<Object,Object>> sortList;
32+
private List<RowFilter<Object,Object>> sortDate;
33+
private String formatIfDate;
34+
public TablePanel(Object[][] rows, String columns[]){
35+
table = new FTable(rows,columns);
36+
table.getTableHeader().setReorderingAllowed(false);
37+
sortList = new ArrayList<RowFilter<Object,Object>>();
38+
sortDate = new ArrayList<RowFilter<Object,Object>>();
39+
formatIfDate = "dd/MM/yyyy";
40+
41+
}
42+
43+
public TablePanel(JTable table){
44+
formatIfDate = "dd/MM/yyyy";
45+
46+
this.table = table;
47+
table.getTableHeader().setReorderingAllowed(false);
48+
sortList = new ArrayList<RowFilter<Object,Object>>();
49+
sortDate = new ArrayList<RowFilter<Object,Object>>();
50+
51+
initUI();
52+
}
53+
54+
public TablePanel(JTable table,String format){
55+
formatIfDate = format;
56+
57+
this.table = table;
58+
table.getTableHeader().setReorderingAllowed(false);
59+
sortList = new ArrayList<RowFilter<Object,Object>>();
60+
sortDate = new ArrayList<RowFilter<Object,Object>>();
61+
62+
initUI();
63+
}
64+
65+
66+
@SuppressWarnings("unchecked")
67+
public void queryChanged(int index){
68+
String text = queryFields[index].getText();
69+
if(table.getColumnClass(index).equals(Date.class)){
70+
SimpleDateFormat dateFormat = new SimpleDateFormat(formatIfDate);
71+
String text2 = secondDateFields[index].getText();
72+
73+
if(text2.equals("") && !text.equals("")){
74+
75+
try{
76+
sortList.set(index,RowFilter.dateFilter(RowFilter.ComparisonType.EQUAL,dateFormat.parse(text),index));
77+
}catch(ParseException e){
78+
System.out.println("Error");
79+
}
80+
}else if(text.equals("") && !text2.equals("")){
81+
try{
82+
83+
sortList.set(index,RowFilter.dateFilter(RowFilter.ComparisonType.EQUAL,dateFormat.parse(text2),index));
84+
85+
}catch(ParseException e){
86+
87+
System.out.println("Error");
88+
}
89+
}else if(text.equals("") && text2.equals("")){
90+
91+
sortList.set(index,RowFilter.regexFilter(text,index));
92+
93+
}else{
94+
try{
95+
96+
sortDate = new ArrayList<RowFilter<Object,Object>>();
97+
98+
sortDate.add(RowFilter.dateFilter(RowFilter.ComparisonType.AFTER,dateFormat.parse(text),index));
99+
sortDate.add(RowFilter.dateFilter(RowFilter.ComparisonType.BEFORE,dateFormat.parse(text2),index));
100+
sortList.set(index,RowFilter.andFilter(sortDate));
101+
102+
}catch(ParseException e){
103+
104+
System.out.println("Error");
105+
//sortList.set(index,RowFilter.regexFilter(text,index));
106+
}
107+
}
108+
//}
109+
}else{
110+
111+
if(sensitive[index].isSelected())
112+
sortList.set(index,RowFilter.regexFilter(text,index));
113+
else
114+
sortList.set(index,RowFilter.regexFilter("(?i)"+text,index));
115+
}
116+
((TableRowSorter<TableModel>)table.getRowSorter()).setRowFilter(RowFilter.andFilter(sortList));
117+
}
118+
119+
120+
public void initListeners(JComponent component,int index){
121+
if(component instanceof JTextField){
122+
((JTextField)component).getDocument().addDocumentListener(new DocumentListener(){
123+
final int i = index;
124+
public void changedUpdate(DocumentEvent e){
125+
queryChanged(i);
126+
}
127+
public void removeUpdate(DocumentEvent e){
128+
queryChanged(i);
129+
}
130+
public void insertUpdate(DocumentEvent e){
131+
queryChanged(i);
132+
}
133+
134+
});
135+
}else if(component instanceof JCheckBox){
136+
((JCheckBox)component).addItemListener(new ItemListener(){
137+
final int i = index;
138+
public void itemStateChanged(ItemEvent e){
139+
//Trigger change on JTextField
140+
queryChanged(i);
141+
}
142+
});
143+
}
144+
}
145+
146+
public void initUI(){
147+
queryFields = new JTextField[table.getColumnCount()];
148+
secondDateFields = new JTextField[table.getColumnCount()];
149+
sensitive = new JCheckBox[table.getColumnCount()];
150+
filters = new JPanel();
151+
filters.setLayout(new BoxLayout(filters,BoxLayout.X_AXIS));
152+
153+
//filters = new JPanel(new BoxLayout(filters,BoxLayout.X_AXIS));
154+
for(int i = 0; i < table.getColumnCount();i++){
155+
queryFields[i] = new JTextField();
156+
//sensitive[i] = new JCheckBox();
157+
if(table.getColumnClass(i).equals(Date.class)){
158+
159+
table.getColumnModel().getColumn(i).setCellRenderer(new AwesomeRender());
160+
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
161+
secondDateFields[i] = new JTextField();
162+
initListeners(secondDateFields[i],i);
163+
initListeners(queryFields[i],i);
164+
initListeners(sensitive[i],i);
165+
JPanel aux = new JPanel();
166+
JPanel helper = new JPanel();
167+
helper.setLayout(new BoxLayout(helper,BoxLayout.Y_AXIS));
168+
helper.add(queryFields[i]);
169+
helper.add(secondDateFields[i]);
170+
filters.add(helper);
171+
172+
try{
173+
sortDate.add(RowFilter.dateFilter(RowFilter.ComparisonType.EQUAL,dateFormat.parse(queryFields[i].getText()),i));
174+
sortDate.add(RowFilter.dateFilter(RowFilter.ComparisonType.EQUAL,dateFormat.parse(secondDateFields[i].getText()),i));
175+
//sortList.add(RowFilter.dateFilter(RowFilter.ComparisonType.EQUAL,dateFormat.parse(queryFields[i].getText()),i));
176+
sortList.add(RowFilter.andFilter(sortDate));
177+
}catch(ParseException e){
178+
System.out.println("sem parse");
179+
180+
sortList.add(RowFilter.regexFilter(queryFields[i].getText(),i));
181+
}
182+
}else{
183+
sensitive[i] = new JCheckBox();
184+
initListeners(queryFields[i],i);
185+
initListeners(sensitive[i],i);
186+
filters.add(sensitive[i]);
187+
filters.add(queryFields[i]);
188+
189+
sortList.add(RowFilter.regexFilter(queryFields[i].getText(),i));
190+
}
191+
192+
}
193+
194+
setLayout(new BorderLayout());
195+
JScrollPane scrollpane = new JScrollPane(table);
196+
add(filters,BorderLayout.NORTH);
197+
add(scrollpane,BorderLayout.CENTER);
198+
199+
}
200+
201+
202+
private class AwesomeRender extends DefaultTableCellRenderer{
203+
SimpleDateFormat f = new SimpleDateFormat(formatIfDate);
204+
205+
public void setFormat(SimpleDateFormat f){
206+
this.f = f;
207+
}
208+
@Override
209+
public Component getTableCellRendererComponent(JTable table,
210+
Object value, boolean isSelected, boolean hasFocus,
211+
int row, int column) {
212+
if( value instanceof Date) {
213+
value = f.format(value);
214+
}
215+
return super.getTableCellRendererComponent(table, value, isSelected,
216+
hasFocus, row, column);
217+
}
218+
219+
}
220+
221+
222+
223+
}

0 commit comments

Comments
 (0)