Java 行排序后在JTable中选择行

Java 行排序后在JTable中选择行,java,swing,jtable,Java,Swing,Jtable,我希望以编程方式选择列排序后JTable中的第一行。我该怎么办? 我编写了自己的类来监听JTable标题上的鼠标事件。在这个类中,我在桌子上指定或不指定TableRowSorter。例如:第一次单击“升序排序”,第二次单击“降序”,依此类推;。如果我把选择放在这个类的末尾,结果是不可预测的 class ClickHeader extends MouseAdapter { JTable table; static int headerClickCount; TableRowSorter sort

我希望以编程方式选择列排序后JTable中的第一行。我该怎么办? 我编写了自己的类来监听JTable标题上的鼠标事件。在这个类中,我在桌子上指定或不指定TableRowSorter。例如:第一次单击“升序排序”,第二次单击“降序”,依此类推;。如果我把选择放在这个类的末尾,结果是不可预测的

class ClickHeader extends MouseAdapter {

JTable table;
static int headerClickCount;
TableRowSorter sorter = new TableRowSorter();
static int lastColumn = -1;


ClickHeader(JTable t) {
    table = t;
    headerClickCount=0;
    lastColumn=-1;
}

@Override
public void mousePressed(MouseEvent e) {       
    TableModel model = table.getModel();
    int vColIndex = table.getTableHeader().getColumnModel().getColumnIndexAtX(e.getX());
    if (vColIndex == -1) {
        return;
    }

    vColIndex = table.convertColumnIndexToModel(vColIndex);

    if(lastColumn != vColIndex){
        lastColumn = vColIndex;
        headerClickCount=0;
    }
    //
    headerClickCount++;
    if (headerClickCount == 3) {
        table.setRowSorter(null);
        sorter = new TableRowSorter();
        headerClickCount = 0;
    } else {
        if (table.getRowSorter() == null) {
            sorter.setModel(model);

        }

        table.setRowSorter(sorter);
    }

    table.getTableHeader().repaint();
}

}

如果需要选择第一个。行,然后您可以使用#,例如

myTable.changeSelection(row, column, false, false);

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.table.*;
公共类TableWithGradient扩展JFrame{
私有静态最终长serialVersionUID=1L;
私有JTable myTable;
公共int columnIndex=0;
public boolean columnIndexAble=false;
公共表格(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[]columnNames={“名字”、“姓氏”、“运动”、“年岁”、“素食者”};
对象[][]数据={
{“Kathy”,“Smith”,“滑雪板”,新整数(5),false},
{“John”,“Doe”,“Rowing”,新整数(3),真},
{“Sue”,“Black”,“kniting”,新整数(2),false},
{“Jane”,“White”,“Speed reading”,新整数(20),true},
{“Joe”,“Brown”,“Pool”,新整数(10),false},
{“凯西”,“史密斯”,“滑雪板”,新整数(5),假};
myTable=新的TableBackroundPaint(数据、列名称);
myTable.setSelectionMode(ListSelectionModel.SINGLE_选择);
myTable.setGridColor(Color.gray);
final TableCellRenderer tcrOs=myTable.getTableHeader().getDefaultRenderer();
myTable.getTableHeader().setDefaultRenderer(新的TableCellRenderer()){
@凌驾
公共组件GetTableCellRenderComponent(JTable表,
对象值,布尔值为选定,布尔值为焦点,整数行,整数列){
JLabel lbl=(JLabel)tcrOs.GetTableCellRenderComponent(
表、值、isSelected、hasFocus、行、列);
lbl.设置前景(颜色:黑色);
lbl.setboorder(BorderFactory.createCompoundBorder(
lbl.getBorder(),BorderFactory.createEmptyByOrder(0,5,0,0));
lbl.设置水平对齐(左摆角);
if(columnIndex==列和列索引可转换){
lbl.设置前景(颜色为红色);
立根背景(颜色:黄色);
}否则{
lbl.设置前景(颜色:黑色);
lbl.挫折背景(颜色:橙色);
}
返回lbl;
}
});
myTable.setPreferredScrollableViewportSize(新维度(
myTable.getPreferredSize().width+100,myTable.getPreferredSize().height);
最终TableRowSorter-sorter=新的TableRowSorter(myTable.getModel());
myTable.setRowSorter(分拣机);
JTableHeader=myTable.getTableHeader();
header.addMouseListener(新的OsPanelImportColumnHeaderListener(this));
添加(新的JScrollPane(myTable),BorderLayout.CENTER);
设置位置(100100);
包装();
setVisible(真);
}
公共静态void main(字符串参数[]){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
TableWithGradient TableWithGradient=新建TableWithGradient();
}
});
}
}
类OsPanelImportColumnHeaderListener扩展了MouseApter{
私人桌面,带有梯度osPanelImport;
公共osPanelImport ColumnerListener(带有梯度osPanelImport的表格){
this.osPanelImport=osPanelImport;
}
@凌驾
公共无效mouseClicked(MouseEvent evt){
osPanelImport.columnIndexAble=真;
JTable table=((JTableHeader)evt.getSource()).getTable();
TableColumnModel colModel=table.getColumnModel();
osPanelImport.columnIndex=colModel.getColumnIndexAtX(evt.getX());
表.changeSelection(0,0,false,false);
返回;
}
}
类TableBackroundPaint扩展了JTable{
私有静态最终长serialVersionUID=1L;
TableBackroundPaint(对象[][]数据,对象[]头部){
超级(数据,头部);
设置不透明(假);
((JComponent)getDefaultRenderer(Object.class)).set不透明(false);
}
@凌驾
公共组件(图形g){
颜色背景=新颜色(168、210、241);
颜色控制颜色=新颜色(230、240、230);
int width=getWidth();
int height=getHeight();
图形2d g2=(图形2d)g;
绘制oldPaint=g2.getPaint();
g2.setPaint(新的GradientPaint(0,0,背景,宽度,0,控制颜色));
g2.fillRect(0,0,宽度,高度);
g2.setPaint(旧漆);
for(int行:getSelectedRows()){
矩形开始=getCellRect(行,0,真);
矩形结束=getCellRect(行,getColumnCount()-1,true);
g2.setPaint(新的GradientPaint(start.x,0,controlColor,
(int)((end.x+end.width-start.x)*1.25),0,颜色为橙色);
g2.fillRect(start.x,start.y,end.x+end.width-start.x,start.height);
}
超级组件(g);
}
}

如果需要选择第一个。行,然后您可以使用#,例如

myTable.changeSelection(row, column, false, false);

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.table.*;
公共类TableWithGradient扩展JFrame{
私有静态最终长serialVersionUID=1L;
私有JTable myTable;
公共int columnIndex=0;
public boolean columnIndexAble=false;
公共表格(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[]columnNames={“名字”、“姓氏”、“运动”、“年岁”、“素食者”};
奥布耶
setRowSelectionInterval(int index0, int index1);
table.setRowSelectionInterval(0,0);