Java 获取JTable中的topX元素

Java 获取JTable中的topX元素,java,swing,jtable,defaulttablemodel,rowfilter,Java,Swing,Jtable,Defaulttablemodel,Rowfilter,我有一个可按列标题排序的JTable: 我现在只想显示表中的前X行。 已了解表排序不在tableModel中。我认为将JTable数据复制到模型中,然后只检索第一个X元素是个好主意。但它似乎失败了。你知道如何解决这个问题吗 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JComboBox; import javax.swing.JFrame; import

我有一个可按列标题排序的
JTable

我现在只想显示表中的前X行。 已了解表排序不在tableModel中。我认为将JTable数据复制到模型中,然后只检索第一个X元素是个好主意。但它似乎失败了。你知道如何解决这个问题吗

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class SortJTable {

    public static void main(String[] args) {
        final String[] columns = getTableColumns();
        final Object[][] tableData = getTableValues();
        TableModel model = new DefaultTableModel(tableData, columns);

        final JTable table = new JTable(model);
        table.setAutoCreateRowSorter(true); // Make it possible to column-sort

        final JComboBox<String> box = new JComboBox<String>();
        box.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {

                // TRY TO SORT THE MODEL AS THE TABLE
                for(int i=0; i<10; i++)
                    table.convertColumnIndexToModel(i);

                // IF MODEL IS SORTED AS TABLE: TAKE WANTED ELEMENTS
                Object[][] newModel;
                if(box.getSelectedIndex() == 0){
                    System.out.println("SHOW ALL");
                }
                else if(box.getSelectedIndex() == 1){
                    System.out.println("SHOW 5");

                    // CREATE NEW MODEL WITH ONLY 5 FIRST ELEMENTS FROM THE SORTED MODEL
                    newModel = new Object[5][10];
                    for(int col=0; col<tableData[0].length; col++){
                        for(int row=0; row<5; row++){
                            newModel[row][col] = tableData[row][col];

                            TableModel model = new DefaultTableModel(tableData, columns);
                            table.setModel(model);
                        }
                    }
                }
                else{
                    System.out.println("SHOW 10");
                }
            }
        });
        box.addItem("Show all rows");
        box.addItem("Show 5 first rows");
        box.addItem("Show 10 first rows");

        JPanel content = new JPanel();
        content.add(new JScrollPane(table));
        content.add(box);

        JFrame frame = new JFrame();
        frame.add(content);
        frame.pack();
        frame.setVisible(true);
    }

    private static String[] getTableColumns(){
        String[] columns = new String[10];
        for(int i=0; i<10; i++)
            columns[i] = "col"+i;
        return columns;
    }

    private static Object[][] getTableValues(){
        Object[][] tableData = new Object[10][10];
        for(int i=0; i<tableData.length; i++){
            for(int j=0; j<tableData[0].length; j++){
                tableData[i][j] = i+""+j;
            }
        }
        return tableData;
    }
}
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableModel;
公共类排序表{
公共静态void main(字符串[]args){
最终字符串[]columns=getTableColumns();
最终对象[][]tableData=getTableValues();
TableModel模型=新的DefaultTableModel(tableData,列);
最终JTable表格=新JTable(模型);
table.setAutoCreateRowSorter(true);//使列排序成为可能
最终JComboBox=新JComboBox();
addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
//尝试将模型按表格进行排序

对于(int i=0;i此方法覆盖JTable的
getRowCount()
方法:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class SortJTable {

    public static void main(String[] args) {
        final String[] columns = getTableColumns();
        final Object[][] tableData = getTableValues();
        TableModel model = new DefaultTableModel(tableData, columns);

        final JTable table = new JTable(model)
        {
            @Override
            public int getRowCount()
            {
                int rows = (int)getClientProperty("rows");

                if (rows == -1)
                    return getModel().getRowCount();
                else
                    return rows;
            }
        };
        table.setAutoCreateRowSorter(true); // Make it possible to column-sort

        final JComboBox<String> box = new JComboBox<String>();
        box.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e)
            {
                if(box.getSelectedIndex() == 0)
                {
                    System.out.println("SHOW ALL");
                    table.putClientProperty("rows", new Integer(-1));
                }
                else if(box.getSelectedIndex() == 1)
                {
                    System.out.println("SHOW 5");
                    table.putClientProperty("rows", new Integer(5));

                }
                else
                {
                    System.out.println("SHOW 7");
                    table.putClientProperty("rows", new Integer(7));
                }

                table.revalidate();
                table.repaint();
            }
        });
        box.addItem("Show all rows");
        box.addItem("Show 5 first rows");
        box.addItem("Show 7 first rows");

        JFrame frame = new JFrame();
        frame.add(new JScrollPane(table));
        frame.add(box, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

    private static String[] getTableColumns(){
        String[] columns = new String[10];
        for(int i=0; i<10; i++)
            columns[i] = "col"+i;
        return columns;
    }

    private static Object[][] getTableValues(){
        Object[][] tableData = new Object[10][10];
        for(int i=0; i<tableData.length; i++){
            for(int j=0; j<tableData[0].length; j++){
                tableData[i][j] = i+""+j;
            }
        }
        return tableData;
    }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.table.*;
公共类排序表{
公共静态void main(字符串[]args){
最终字符串[]columns=getTableColumns();
最终对象[][]tableData=getTableValues();
TableModel模型=新的DefaultTableModel(tableData,列);
最终JTable表=新JTable(模型)
{
@凌驾
public int getRowCount()
{
int rows=(int)getClientProperty(“rows”);
如果(行==-1)
返回getModel().getRowCount();
其他的
返回行;
}
};
table.setAutoCreateRowSorter(true);//使列排序成为可能
最终JComboBox=新JComboBox();
addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e)
{
if(box.getSelectedIndex()==0)
{
System.out.println(“全部显示”);
table.putClientProperty(“行”,新整数(-1));
}
else if(box.getSelectedIndex()==1)
{
系统输出打印项次(“显示5”);
表.putClientProperty(“行”,新整数(5));
}
其他的
{
System.out.println(“显示7”);
表.putClientProperty(“行”,新整数(7));
}
表.重新验证();
表1.repaint();
}
});
box.addItem(“显示所有行”);
框。添加项(“显示前5行”);
框。添加项(“显示前7行”);
JFrame=新JFrame();
frame.add(新的JScrollPane(表));
框架。添加(框,边框布局。南);
frame.pack();
frame.setVisible(true);
}
私有静态字符串[]getTableColumns(){
字符串[]列=新字符串[10];

对于(int i=0;没有理由使用table.revalidate();使用RowFilter(我添加的标记)应该很容易。我有一个JList排序依据..你可能是指JTable?@kleopatra请查看她/他的最后一个问题查看此代码,你似乎误解了convertXXIndexTo的角色(顺便说一句:你可能对xx=column不感兴趣,是吗?):它对实际更改索引的状态没有任何作用,它只是一个转换方法-因此,如果不使用返回值执行某些操作,调用它是没有意义的非常干净的解决方案。非常好。谢谢!