java - 如何自动选择JTable中最后插入的行?

标签 java swing jtable

因为 JTable 可以排序。 如何设置它在插入行时自动选择最后插入的行?

谢谢

最佳答案

您的 TableModel 可以重新调整行数,并且通过使用 convertRowIndexToView 可以将新的/添加的行放在最后。您可以在 TableView 中获取行,然后传递给 changeSelection 公共(public)无效changeSelection(int rowIndex,int columnIndex, boolean 切换, boolean 扩展)

编辑:示例(享受编码的numbersOfRows - 3而不是正确的numbersOfRows - 1):

import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.event.*;
import javax.swing.table.*;

public class TestTableRowTable {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                try {
                    // UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                        if (info.getName().equals("Nimbus")) {
                            UIManager.setLookAndFeel(info.getClassName());
                            break;
                        }
                    }
                } catch (Exception e1) {
                    e1.printStackTrace();
                }

                final JTable table = new JTable(10, 6);
                for (int i = 0; i < table.getRowCount(); i++) {
                    table.setValueAt(i, i, 0);
                }
                final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel());
                table.setRowSorter(sorter);
                final AbstractTableModel model = new AbstractTableModel() {

                    private static final long serialVersionUID = 1L;

                    @Override
                    public int getColumnCount() {
                        return 1;
                    }

                    @Override
                    public Object getValueAt(int row, int column) {
                        return table.convertRowIndexToModel(row);
                    }

                    @Override
                    public int getRowCount() {
                        return table.getRowCount();
                    }
                };
                JTable headerTable = new JTable(model);
                headerTable.setShowGrid(false);
                headerTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                headerTable.setPreferredScrollableViewportSize(new Dimension(30, 0));
                headerTable.getColumnModel().getColumn(0).setPreferredWidth(30);
                headerTable.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() {

                    @Override
                    public Component getTableCellRendererComponent(JTable x, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

                        boolean selected = table.getSelectionModel().isSelectedIndex(row);
                        Component component = table.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(table, value, false, false, -1, -2);
                        ((JLabel) component).setHorizontalAlignment(JLabel.CENTER);
                        if (selected) {
                            component.setFont(component.getFont().deriveFont(Font.BOLD));
                        } else {
                            component.setFont(component.getFont().deriveFont(Font.PLAIN));
                        }
                        return component;
                    }
                });
                table.getRowSorter().addRowSorterListener(
                        new RowSorterListener() {

                            @Override
                            public void sorterChanged(RowSorterEvent e) {
                                model.fireTableDataChanged();
                            }
                        });
                table.getSelectionModel().addListSelectionListener(
                        new ListSelectionListener() {

                            @Override
                            public void valueChanged(ListSelectionEvent e) {
                                model.fireTableRowsUpdated(0, model.getRowCount() - 1);
                            }
                        });
                JScrollPane pane = new JScrollPane(table);
                pane.setRowHeaderView(headerTable);
                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.getContentPane().add(pane);
                frame.getContentPane().add(new JButton(new AbstractAction("Toggle filter") {

                    private static final long serialVersionUID = 1L;
                    private RowFilter<TableModel, Object> filter = new RowFilter<TableModel, Object>() {

                        @Override
                        public boolean include(javax.swing.RowFilter.Entry<? extends TableModel, ? extends Object> entry) {
                            return ((Number) entry.getValue(0)).intValue() % 2 == 0;
                            //return ((String) entry.getValue(0)).length()>0 ;
                            //return ((Date) entry.getValue(0)).getTime()< ;
                        }
                    };

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        if (sorter.getRowFilter() != null) {
                            sorter.setRowFilter(null);
                            TableModel tblModel = table.getModel();
                            int numbersOfRows = 0;
                            numbersOfRows = tblModel.getRowCount();
                            int lastRow = 0;
                            lastRow = table.convertRowIndexToView(numbersOfRows - 3);
                            table.changeSelection(lastRow, 0, false, false);
                        } else {
                            sorter.setRowFilter(filter);
                        }
                    }
                }), BorderLayout.PAGE_END);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    private TestTableRowTable() {
    }
}

关于java - 如何自动选择JTable中最后插入的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6179016/

相关文章:

java - 服务层静态对象字段有什么用

带轮廓的 Java 异形窗口

Java - 单击按钮时将数组列表中的项目添加到 JTable

java - 如果我使用 JTable,setLookAndFeel() 会给出 NullPointerException

java - JTextField 使用不当(可能)帮助创建 GUI

java - 使用 Spring MVC 处理多个 URL 参数

java - 尝试从 VCS 导入项目时出现 "Cause: error=2, No such file or directory"- Linux 上的 Java Home 问题

java - 将图像从一个面板移动到另一个面板

java - 根据用户输入显示多个对话框提示

java - 更改 JTable 上的 Ctrl + 单击行为