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不感兴趣,是吗?):它对实际更改索引的状态没有任何作用,它只是一个转换方法-因此,如果不使用返回值执行某些操作,调用它是没有意义的非常干净的解决方案。非常好。谢谢!