Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现TableFilterDemo_Java_Swing_Jtable_Tablefilter - Fatal编程技术网

Java 实现TableFilterDemo

Java 实现TableFilterDemo,java,swing,jtable,tablefilter,Java,Swing,Jtable,Tablefilter,我在java中实现这个示例时遇到了一个问题,tableFilterDemo是一个类,它使用一个文本字段对我编写的每个caracther进行排序和查找。 我必须连接到我的数据库并用这些数据加载表,但是这个示例实现的mytablemodel对我来说不兼容。 我尝试了不同的方法。我需要其他方法来实现这个示例。我找不到其他这样做的例子 public class TableFilterDemo extends JPanel { private boolean DEBUG = false; private

我在java中实现这个示例时遇到了一个问题,tableFilterDemo是一个类,它使用一个文本字段对我编写的每个caracther进行排序和查找。 我必须连接到我的数据库并用这些数据加载表,但是这个示例实现的mytablemodel对我来说不兼容。 我尝试了不同的方法。我需要其他方法来实现这个示例。我找不到其他这样做的例子

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的逻辑