Java 按列排序时调用的JTable方法
当用户单击列标题对相对列进行排序时,JTable(或相关类)中是否有调用的方法?Java 按列排序时调用的JTable方法,java,swing,sorting,jtable,Java,Swing,Sorting,Jtable,当用户单击列标题对相对列进行排序时,JTable(或相关类)中是否有调用的方法? 我想在排序操作开始之前,在用户单击列标题时执行一些操作。这是可能的吗?在Java5中,您将对BasicTableHeaderUI和override进行子类化,并将其声明为protected以返回自定义侦听器 在Java6中,很多swing都被更改了,不知道它是如何完成的。 import java.awt.*; 导入java.awt.event.ActionEvent; 导入javax.swing.*; 导入java
我想在排序操作开始之前,在用户单击列标题时执行一些操作。这是可能的吗?在Java5中,您将对BasicTableHeaderUI和override进行子类化,并将其声明为protected以返回自定义侦听器 在Java6中,很多swing都被更改了,不知道它是如何完成的。
import java.awt.*;
导入java.awt.event.ActionEvent;
导入javax.swing.*;
导入javax.swing.UIManager.LookAndFeelInfo;
导入javax.swing.event.*;
导入javax.swing.table.*;
公共类TestTableRowTable{
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
//UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
for(LookAndFeelInfo:UIManager.getInstalledLookAndFeels()){
if(info.getName().equals(“Nimbus”)){
UIManager.setLookAndFeel(info.getClassName());
打破
}
}
}捕获(异常e1){
e1.printStackTrace();
}
最终JTable表=新JTable(10,6);
对于(int i=0;i public boolean include(javax.swing.RowFilter.Entryoh,谢谢..我还在处理这个问题:。我想在对表进行排序之前更改一段时间的行号,然后在排序后重置正确的行号,这可能是空行条目的一种解决方法..+1:)@0详细不要忘记,如果您将RowFilter设置为具体的TableColumn,那么另一个TableColumns会忽略这一点-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);
} else {
sorter.setRowFilter(filter);
}
}
}), BorderLayout.PAGE_END);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
private TestTableRowTable() {
}
}