Java 实现TableFilterDemo
我在java中实现这个示例时遇到了一个问题,tableFilterDemo是一个类,它使用一个文本字段对我编写的每个caracther进行排序和查找。 我必须连接到我的数据库并用这些数据加载表,但是这个示例实现的mytablemodel对我来说不兼容。 我尝试了不同的方法。我需要其他方法来实现这个示例。我找不到其他这样做的例子Java 实现TableFilterDemo,java,swing,jtable,tablefilter,Java,Swing,Jtable,Tablefilter,我在java中实现这个示例时遇到了一个问题,tableFilterDemo是一个类,它使用一个文本字段对我编写的每个caracther进行排序和查找。 我必须连接到我的数据库并用这些数据加载表,但是这个示例实现的mytablemodel对我来说不兼容。 我尝试了不同的方法。我需要其他方法来实现这个示例。我找不到其他这样做的例子 public class TableFilterDemo extends JPanel { private boolean DEBUG = false; private
public class TableFilterDemo extends JPanel {
private boolean DEBUG = false;
private JTable table;
private JTextField filterText;
private JTextField statusText;
private TableRowSorter<MyTableModel> sorter;
public TableFilterDemo() {
super();
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
//Create a table with a sorter.
MyTableModel model = new MyTableModel();
sorter = new TableRowSorter<MyTableModel>(model);
table = new JTable(model);
table.setRowSorter(sorter);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
//For the purposes of this example, better to have a single
//selection.
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//When selection changes, provide user with row numbers for
//both view and model.
table.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
public void valueChanged(ListSelectionEvent event) {
int viewRow = table.getSelectedRow();
if (viewRow < 0) {
//Selection got filtered away.
statusText.setText("");
} else {
int modelRow =
table.convertRowIndexToModel(viewRow);
statusText.setText(
String.format("Selected Row in view: %d. "
+ "Selected Row in model: %d.",
viewRow, modelRow));
}
}
});
//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
//Add the scroll pane to this panel.
add(scrollPane);
//Create a separate form for filterText and statusText
JPanel form = new JPanel(new SpringLayout());
JLabel l1 = new JLabel("Filter Text:", SwingConstants.TRAILING);
form.add(l1);
filterText = new JTextField();
//Whenever filterText changes, invoke newFilter.
filterText.getDocument().addDocumentListener(
new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
newFilter();
}
public void insertUpdate(DocumentEvent e) {
newFilter();
}
public void removeUpdate(DocumentEvent e) {
newFilter();
}
});
l1.setLabelFor(filterText);
form.add(filterText);
JLabel l2 = new JLabel("Status:", SwingConstants.TRAILING);
form.add(l2);
statusText = new JTextField();
l2.setLabelFor(statusText);
form.add(statusText);
SpringUtilities.makeCompactGrid(form, 2, 2, 6, 6, 6, 6);
add(form);
}
/**
* Update the row filter regular expression from the expression in
* the text box.
*/
private void newFilter() {
RowFilter<MyTableModel, Object> rf = null;
//If current expression doesn't parse, don't update.
try {
rf = RowFilter.regexFilter(filterText.getText(), 0);
} catch (java.util.regex.PatternSyntaxException e) {
return;
}
sorter.setRowFilter(rf);
}
class MyTableModel extends AbstractTableModel {
private String[] columnNames = {"First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian"};
private Object[][] data = {
{"Kathy", "Smith",
"Snowboarding", new Integer(5), new Boolean(false)},
{"John", "Doe",
"Rowing", new Integer(3), new Boolean(true)},
{"Sue", "Black",
"Knitting", new Integer(2), new Boolean(false)},
{"Jane", "White",
"Speed reading", new Integer(20), new Boolean(true)},
{"Joe", "Brown",
"Pool", new Integer(10), new Boolean(false)}
};
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
/*
* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
*/
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/*
* Don't need to implement this method unless your table's
* editable.
*/
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col < 2) {
return false;
} else {
return true;
}
}
/*
* Don't need to implement this method unless your table's
* data can change.
*/
public void setValueAt(Object value, int row, int col) {
if (DEBUG) {
System.out.println("Setting value at " + row + "," + col
+ " to " + value
+ " (an instance of "
+ value.getClass() + ")");
}
data[row][col] = value;
fireTableCellUpdated(row, col);
if (DEBUG) {
System.out.println("New value of data:");
printDebugData();
}
}
private void printDebugData() {
int numRows = getRowCount();
int numCols = getColumnCount();
for (int i = 0; i < numRows; i++) {
System.out.print(" row " + i + ":");
for (int j = 0; j < numCols; j++) {
System.out.print(" " + data[i][j]);
}
System.out.println();
}
System.out.println("--------------------------");
}
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("TableFilterDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
TableFilterDemo newContentPane = new TableFilterDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
但是这个示例实现的mytablemodel与我不兼容
该示例适用于任何TableModel
如果MyTableModel没有按您想要的方式存储数据,那么就不要使用它
使用DefaultTableModel或您创建的任何自定义模型
但是这个示例实现的mytablemodel与我不兼容
该示例适用于任何TableModel
如果MyTableModel没有按您想要的方式存储数据,那么就不要使用它
使用DefaultTableModel或您创建的任何自定义模型。您有两种解决问题的方法: 要么让TableModel直接与数据库通信 或者,如果数据库足够小,您可以缓存它,这意味着如果您不知道数据库的大小,那么这不是一种合适的方法 示例1我只是演示了如何实现getRowCount方法,我让您执行其他方法:
class MyTableModel extends AbstractTableModel {
private final Connection connection;
private final String[] columnNames = { "First Name", "Last Name", "Sport", "# of Years", "Vegetarian" };
private final Object[][] data = {
{ "Kathy", "Smith", "Snowboarding", new Integer(5), new Boolean(false) },
{ "John", "Doe", "Rowing", new Integer(3), new Boolean(true) },
{ "Sue", "Black", "Knitting", new Integer(2), new Boolean(false) },
{ "Jane", "White", "Speed reading", new Integer(20), new Boolean(true) },
{ "Joe", "Brown", "Pool", new Integer(10), new Boolean(false) } };
public MyTableModel() throws SQLException {
connection = DriverManager.getConnection("jdbc:mysql://[host][:port]/[database]");
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
int rowCount = 0;
Statement stmt = null;
ResultSet rs = null;
try {
stmt = connection.createStatement();
rs = stmt.executeQuery("SELECT count(*) FROM <YourTable>");
if (rs.next()) {
rowCount = rs.getInt(1);
}
} catch (SQLException e) {
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
}
}
}
return rowCount;
}
...
}
您有两种解决问题的方法: 要么让TableModel直接与数据库通信 或者,如果数据库足够小,您可以缓存它,这意味着如果您不知道数据库的大小,那么这不是一种合适的方法 示例1我只是演示了如何实现getRowCount方法,我让您执行其他方法:
class MyTableModel extends AbstractTableModel {
private final Connection connection;
private final String[] columnNames = { "First Name", "Last Name", "Sport", "# of Years", "Vegetarian" };
private final Object[][] data = {
{ "Kathy", "Smith", "Snowboarding", new Integer(5), new Boolean(false) },
{ "John", "Doe", "Rowing", new Integer(3), new Boolean(true) },
{ "Sue", "Black", "Knitting", new Integer(2), new Boolean(false) },
{ "Jane", "White", "Speed reading", new Integer(20), new Boolean(true) },
{ "Joe", "Brown", "Pool", new Integer(10), new Boolean(false) } };
public MyTableModel() throws SQLException {
connection = DriverManager.getConnection("jdbc:mysql://[host][:port]/[database]");
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
int rowCount = 0;
Statement stmt = null;
ResultSet rs = null;
try {
stmt = connection.createStatement();
rs = stmt.executeQuery("SELECT count(*) FROM <YourTable>");
if (rs.next()) {
rowCount = rs.getInt(1);
}
} catch (SQLException e) {
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
}
}
}
return rowCount;
}
...
}
我的第一个问题是对象数据。我无法从BD或arraylist中获取初始数据,我需要解决此问题。我想拥有与此页面相同的功能,在tableFilterDemo上,我的第一个问题是对象数据。我无法从BD或arraylist中获取初始数据,我需要解决此问题。我想拥有与此页面相同的功能,在tableFilterDemo上,我尝试过这个功能,但我不知道在文本字段中写入字符时如何过滤表格这是我的问题,在web中,我有一个例子。我想做同样的例子,并适应tableFilterDemo的逻辑,我在尝试这个,但我不知道如何过滤表格时,一个字符写在文本字段这是我的问题,在网上我有一个例子。我想做同样的例子,并适应中tableFilterDemo的逻辑