@@ -53,6 +53,8 @@ public class TaskTable extends JTable implements ActionListener {
5353 70 , // Color
5454 };
5555
56+ private static Vector <String > sColumnNames ;
57+
5658 private final TaskTableModel mTaskTableModel ;
5759 private final TableRowSorter <TaskTableModel > mTableRowSorter ;
5860 private ArrayList <TableFilter <AbstractTableModel >> mTableFilters = new ArrayList <>();
@@ -83,7 +85,10 @@ private Color defaultItemColor(int index, boolean isSelected) {
8385 public Component getTableCellRendererComponent (JTable table , Object value , boolean isSelected , boolean hasFocus , int rowIndex , int columnIndex ) {
8486 Component c = renderer .getTableCellRendererComponent (table , value , isSelected , hasFocus , rowIndex , columnIndex );
8587 TaskData data = getTaskData (rowIndex );
86- String highlight = data .getHighlight ();
88+ String highlight = "" ;
89+ if (data != null ) {
90+ highlight = data .getHighlight ();
91+ }
8792 Color bgColor = FpManager .findColorByName (highlight );
8893 Color fontColor = UIManager .getColor ("Table.foreground" );
8994 // 检测是否需要显示高亮颜色
@@ -112,6 +117,7 @@ public TaskTable() {
112117 setModel (mTaskTableModel );
113118 setAutoResizeMode (JTable .AUTO_RESIZE_OFF );
114119 mTableRowSorter = new TableRowSorter <>(mTaskTableModel );
120+ mTableRowSorter .setMaxSortKeys (1 );
115121 setRowSorter (mTableRowSorter );
116122 // 不可拖动表头
117123 getTableHeader ().setReorderingAllowed (false );
@@ -276,7 +282,23 @@ public void updateRowFilter() {
276282 if (mTempFilters != null && !mTempFilters .isEmpty ()) {
277283 groupFilter .addAll (mTempFilters );
278284 }
279- mTableRowSorter .setRowFilter (RowFilter .andFilter (groupFilter ));
285+ // 检测过滤字段是否有效
286+ ArrayList <TableFilter <AbstractTableModel >> result = new ArrayList <>();
287+ for (TableFilter <AbstractTableModel > filter : groupFilter ) {
288+ FilterRule rule = filter .getRule ();
289+ // 规则为空检测
290+ if (rule == null || rule .getItems ().isEmpty ()) {
291+ continue ;
292+ }
293+ int filterColumnIndex = rule .getColumnIndex ();
294+ // 越界检测
295+ if (filterColumnIndex < 0 || filterColumnIndex >= getColumnCount ()) {
296+ continue ;
297+ }
298+ // 保留有效的过滤规则
299+ result .add (filter );
300+ }
301+ mTableRowSorter .setRowFilter (RowFilter .andFilter (result ));
280302 }
281303
282304 /**
@@ -304,8 +326,11 @@ public void addTaskData(TaskData data) {
304326 * @return 任务数据
305327 */
306328 private TaskData getTaskData (int rowIndex ) {
307- int index = convertRowIndexToModel (rowIndex );
308- return mTaskTableModel .mData .get (index );
329+ if (rowIndex >= 0 && rowIndex < getRowCount ()) {
330+ int index = convertRowIndexToModel (rowIndex );
331+ return mTaskTableModel .mData .get (index );
332+ }
333+ return null ;
309334 }
310335
311336 @ Override
@@ -369,6 +394,9 @@ private String fetchBodyDataByAction(String action, int[] selectedRows) {
369394 StringBuilder result = new StringBuilder ();
370395 for (int index : selectedRows ) {
371396 TaskData data = getTaskData (index );
397+ if (data == null ) {
398+ continue ;
399+ }
372400 byte [] bodyBytes = mOnTaskTableEventListener .getBodyByTaskData (data );
373401 String value ;
374402 switch (action ) {
@@ -419,7 +447,9 @@ private void doSendToRepeater(int[] selectedRows) {
419447 ArrayList <TaskData > newData = new ArrayList <>(selectedRows .length );
420448 for (int index : selectedRows ) {
421449 TaskData data = getTaskData (index );
422- newData .add (data );
450+ if (data != null ) {
451+ newData .add (data );
452+ }
423453 }
424454 if (mOnTaskTableEventListener != null ) {
425455 mOnTaskTableEventListener .onSendToRepeater (newData );
@@ -448,7 +478,9 @@ private void doRemoveItems(int[] selectedRows) {
448478 ArrayList <TaskData > removeList = new ArrayList <>();
449479 for (int index : selectedRows ) {
450480 TaskData data = getTaskData (index );
451- removeList .add (data );
481+ if (data != null ) {
482+ removeList .add (data );
483+ }
452484 }
453485 mTaskTableModel .removeItems (removeList );
454486 }
@@ -463,6 +495,9 @@ private ArrayList<String> getSelectedHosts(int[] selectedRows) {
463495 ArrayList <String > hosts = new ArrayList <>();
464496 for (int index : selectedRows ) {
465497 TaskData data = getTaskData (index );
498+ if (data == null ) {
499+ continue ;
500+ }
466501 try {
467502 String host = new URL (data .getHost ()).getHost ();
468503 if (!hosts .contains (host )) {
@@ -492,8 +527,9 @@ private void onTempFilterEvent(String action, int[] selectedRows) {
492527 }
493528 FilterRule rule = getTempFilterRuleByColumn (columnIndex );
494529 for (int index : selectedRows ) {
495- TaskData data = getTaskData (index );
496- Object objValue = ClassUtils .getValueByFieldId (data , columnIndex );
530+ int rowIndex = convertRowIndexToModel (index );
531+ // 从 TableModel 里拿数据
532+ Object objValue = mTaskTableModel .getValueAt (rowIndex , columnIndex );
497533 String value = "" ;
498534 if (objValue != null ) {
499535 value = String .valueOf (objValue );
@@ -633,6 +669,8 @@ public void refreshColumns() {
633669 if (mTaskTableModel == null ) {
634670 return ;
635671 }
672+ initColumnNames ();
673+ updateRowFilter ();
636674 mTaskTableModel .fireTableStructureChanged ();
637675 initColorLevelSorter ();
638676 initColumnWidth ();
@@ -671,11 +709,22 @@ private static int getColorLevel(String colorName) {
671709 * @return 失败返回空列表
672710 */
673711 public static Vector <String > getColumnNames () {
712+ if (sColumnNames != null ) {
713+ return sColumnNames ;
714+ }
715+ initColumnNames ();
716+ return sColumnNames ;
717+ }
718+
719+ /**
720+ * 初始化所有字段名
721+ */
722+ private static void initColumnNames () {
674723 Vector <String > result = new Vector <>(Arrays .asList (TaskTableModel .PRE_COLUMN_NAMES ));
675724 // 指纹字段名列表
676725 List <String > fpColumnNames = FpManager .getColumnNames ();
677726 result .addAll (fpColumnNames );
678- return result ;
727+ sColumnNames = result ;
679728 }
680729
681730 /**
@@ -789,7 +838,9 @@ public void clearAll() {
789838
790839 @ Override
791840 public int getRowCount () {
792- return mData .size ();
841+ synchronized (this .mData ) {
842+ return mData .size ();
843+ }
793844 }
794845
795846 @ Override
@@ -802,26 +853,38 @@ public String getColumnName(int column) {
802853 return getColumnNames ().get (column );
803854 }
804855
856+ private TaskData getItemData (int rowIndex ) {
857+ if (rowIndex < 0 || rowIndex >= getRowCount ()) {
858+ return null ;
859+ }
860+ synchronized (this .mData ) {
861+ return mData .get (rowIndex );
862+ }
863+ }
864+
805865 @ Override
806866 public Object getValueAt (int rowIndex , int columnIndex ) {
807- TaskData data = mData .get (rowIndex );
808- if (columnIndex < PRE_COLUMN_NAMES .length ) {
867+ TaskData data = getItemData (rowIndex );
868+ if (data == null ) {
869+ return "" ;
870+ }
871+ // 预设列的数据
872+ if (columnIndex >= 0 && columnIndex < PRE_COLUMN_NAMES .length ) {
809873 return ClassUtils .getValueByFieldId (data , columnIndex );
810874 }
811- // 减去预设的列
875+ // 减去预设列的数据,开始填充指纹参数里的数据
812876 columnIndex = columnIndex - PRE_COLUMN_NAMES .length ;
813877 Map <String , String > params = data .getParams ();
814878 String key = FpManager .getColumnId (columnIndex );
815- String value = "" ;
816- if (params .containsKey (key )) {
817- value = params .get (key );
879+ if (key != null && params .containsKey (key )) {
880+ return params .get (key );
818881 }
819- return value ;
882+ return "" ;
820883 }
821884
822885 @ Override
823886 public Class <?> getColumnClass (int columnIndex ) {
824- if (columnIndex < PRE_COLUMN_NAMES .length ) {
887+ if (columnIndex >= 0 && columnIndex < PRE_COLUMN_NAMES .length ) {
825888 return ClassUtils .getTypeByFieldId (TaskData .class , columnIndex );
826889 }
827890 return String .class ;
0 commit comments