From 66f0597bf6a1e79540c6bc51dedf561c22f3bdb5 Mon Sep 17 00:00:00 2001
From: jinlin <jinlin>
Date: 星期二, 13 五月 2025 17:49:26 +0800
Subject: [PATCH] 修改

---
 src/main/java/com/example/client/utils/ComplexTableUI.java |  223 ++++++++++++++++++++++++++++++-------------------------
 1 files changed, 123 insertions(+), 100 deletions(-)

diff --git a/src/main/java/com/example/client/utils/ComplexTableUI.java b/src/main/java/com/example/client/utils/ComplexTableUI.java
index 2d0aa81..bf7ad28 100644
--- a/src/main/java/com/example/client/utils/ComplexTableUI.java
+++ b/src/main/java/com/example/client/utils/ComplexTableUI.java
@@ -12,130 +12,153 @@
  * @author 闆烽攱
  * @Date 2019骞�5鏈�27鏃�
  */
+import javax.swing.*;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumnModel;
+import java.awt.*;
+import java.awt.event.MouseEvent;
+
 public class ComplexTableUI extends BasicTableUI {
-    private Object[][] headerRows;
+    private Object[][] headerRows; // 琛ㄥご鏁版嵁锛岀敤浜庡垽鏂悎骞堕�昏緫
     private JTable table;
-    private int singleRowHeight;
-    public ComplexTableUI(Object[][] headerRows,JTable table){
+    private int singleRowHeight; // 姣忚鐨勯珮搴�
+    private int headerHeight; // 琛ㄥご鐨勬�婚珮搴�
+
+    public ComplexTableUI(Object[][] headerRows, JTable table) {
         this.headerRows = headerRows;
         this.table = table;
-        //鑾峰彇鍗曡鐨勯珮搴︼紝涓嶈兘浣跨敤header.getHeight()鑾峰彇楂樺害锛屽洜涓烘鏃惰〃澶磋繕娌″垵濮嬪寲瀹屾瘯锛岃幏鍙栧嚭鏉ョ殑楂樺害鏄�0
-        this.singleRowHeight = table.getRowHeight();
-//		System.out.println(table.getRowHeight());
-
-        JTableHeader tableHeader = table.getTableHeader();
-        //璁剧疆琛ㄥご涓嶅厑璁告嫋鍔� 銆佺敱浜庡悎骞朵簡鍗曞厓鏍硷紝鎷栧姩涔嬪悗浼氫贡
-        tableHeader.setReorderingAllowed(false);
-        //璁剧疆琛ㄥご鏁翠綋楂樺害銆佸搴�
-        tableHeader.setPreferredSize(new Dimension(table.getWidth(), singleRowHeight * headerRows.length ));
+        this.singleRowHeight = table.getRowHeight(); // 鑾峰彇鍗曡楂樺害
+        this.headerHeight = singleRowHeight * headerRows.length; // 璁$畻琛ㄥご鎬婚珮搴�
     }
 
-    /**
-     * 閲嶅啓BasicTableHeaderUI.paint鐨勬柟娉曟槸鏈�閲嶈鐨勯儴鍒�
-     */
+    @Override
+    public void installUI(JComponent c) {
+        super.installUI(c);
+        // 绂佺敤鍒楃殑鎷栧姩锛屽洜涓哄悎骞跺崟鍏冩牸鍙兘瀵艰嚧甯冨眬娣蜂贡
+        table.getTableHeader().setReorderingAllowed(false);
+    }
+
     @Override
     public void paint(Graphics g, JComponent c) {
-        for( int row = 0 ; row < headerRows.length ; row++ ){
-            Object[] headerRow = headerRows[row];
-            for( int col = 0 ; col < headerRow.length ; col++ ){
-                Object cell = headerRow[col];
-                //濡傛灉鍗曞厓鏍间负鍚堝苟绫诲崟鍏冩牸銆佽幏鍙栧叾涓婃柟鏄疿鍚堝苟绫诲崟鍏冩牸 + 宸﹁竟鏄痀鍚堝苟绫诲崟鍏冩牸锛岄偅涔堣鍗曞厓鏍间笉闇�瑕佸湪绐楀彛灞曠ず
-                if( cell == ComplexTable.mergeCellX || cell == ComplexTable.mergeCellY || ( col > 0 && row > 0 && headerRow[col - 1] == ComplexTable.mergeCellY && headerRows[row-1][col] == ComplexTable.mergeCellX )  )
-                    continue;
-                Rectangle rect = this.getCellRect(row, col);
-                String text = cell == null ? "" : cell.toString();
+        super.paint(g, c); // 缁樺埗榛樿鐨勮〃鏍煎唴瀹�
+
+        // 閬嶅巻琛ㄦ牸涓讳綋鐨勬瘡涓�琛屽拰姣忎竴鍒�
+        for (int row = 0; row < table.getRowCount(); row++) {
+            for (int col = 0; col < table.getColumnCount(); col++) {
+                if (isMergedCell(row, col)) {
+                    continue; // 璺宠繃琚悎骞剁殑鍗曞厓鏍�
+                }
+
+                // 鑾峰彇鍗曞厓鏍肩殑缁樺埗鍖哄煙
+                Rectangle rect = getCellRect(row, col);
+                // 鑾峰彇鍗曞厓鏍煎唴瀹�
+                Object value = table.getValueAt(row, col);
+                String text = value == null ? "" : value.toString();
+
+                // 缁樺埗鍗曞厓鏍�
                 paintCell(g, rect, text);
             }
         }
-
     }
 
     /**
-     * 鑾峰彇褰撳墠鍗曞厓鏍奸渶瑕佸崰澶氬皯涓崟浣嶏紝姣斿姝ゆ椂鐨剅ow+1琛宑ol鍒楃殑鍊�=mergeCell锛岄偅涔堣鏄庡綋鍓嶅崟鍏冩牸闇�瑕佸崰2琛�
-     * @param row
-     * @param col
-     * @return
+     * 鍒ゆ柇鍗曞厓鏍兼槸鍚﹁鍚堝苟
      */
-    private Rectangle getCellRect(int row , int col){
-        int mergeRowNum = 1;
-        int nextRow = row;
-        //鍒ゆ柇鍑簓杞存柟鍚戝悎骞朵簡鍑犺
-        while( ++nextRow < headerRows.length ){
-            Object nextRowCell = headerRows[nextRow][col];
-            if( nextRowCell == ComplexTable.mergeCellY )
-                mergeRowNum++;
-            else
-                break;
-        }
-        int mergeCellNum = 1;
-        int nextCol = col;
-        Object[] headerRow = headerRows[row];
-        //鍒ゆ柇x杞存柟鍚戝悎骞朵簡鍑犲垪
-        while( ++nextCol < headerRow.length ){
-            Object nextCell = headerRow[nextCol];
-            if( nextCell == ComplexTable.mergeCellX )
-                mergeCellNum++;
-            else
-                break;
+    private boolean isMergedCell(int row, int col) {
+        // 绀轰緥锛氬亣璁惧悎骞堕�昏緫鍩轰簬琛ㄦ牸涓讳綋鏁版嵁
+        Object cellValue = table.getValueAt(row, col);
+        return cellValue == ComplexTable.mergeCellX || cellValue == ComplexTable.mergeCellY;
+    }
+
+    /**
+     * 鑾峰彇鍗曞厓鏍肩殑缁樺埗鍖哄煙
+     */
+    private Rectangle getCellRect(int row, int col) {
+        // 鑾峰彇榛樿鍗曞厓鏍煎尯鍩�
+        Rectangle rect = table.getCellRect(row, col, false);
+
+        // 璋冩暣 y 鍧愭爣锛岃�冭檻琛ㄥご楂樺害
+        rect.y += headerHeight;
+
+        // 濡傛灉闇�瑕佸悎骞跺崟鍏冩牸锛岃皟鏁村尯鍩熷ぇ灏�
+        if (isMergedCell(row, col)) {
+            int mergeRowNum = getMergeRowNum(row, col);
+            int mergeColNum = getMergeColNum(row, col);
+            rect.height = getCellHeight(mergeRowNum);
+            rect.width = getCellWidth(col, mergeColNum);
         }
 
-        //寰楀埌涓�涓崟鍏冩牸锛岃捣鐐瑰潗鏍囥�佸搴︺�侀珮搴�
-        Rectangle rect = new Rectangle();
-        rect.height = this.getCellHeight(mergeRowNum);
-        rect.width = this.getCellWidth( col , mergeCellNum);
-        rect.y = this.getCellY(row);
-        rect.x = this.getCellX( col );
         return rect;
     }
 
-    //鏍规嵁鍚堝苟琛屾暟寰楀埌鍗曞厓鏍肩殑楂樺害
-    private int getCellHeight( int mergeRowNum ){
-        int height = 0;
-        for( int i = 0 ; i < mergeRowNum ; i++ )
-            height += singleRowHeight;
-        return height;
-    }
-    //鏍规嵁鍚堝苟鍒楁暟寰楀埌鍗曞厓鏍煎搴�
-    private int getCellWidth( int column , int mergeCellNum ){
-        int width = 0;
-        TableColumnModel colModel = table.getColumnModel();
-        for( int i = 0 ; i < mergeCellNum ; i++ ){
-            width += colModel.getColumn( column + i ).getWidth();
+    /**
+     * 鑾峰彇鍚堝苟鐨勮鏁�
+     */
+    private int getMergeRowNum(int row, int col) {
+        int mergeRowNum = 1;
+        for (int nextRow = row + 1; nextRow < table.getRowCount(); nextRow++) {
+            Object nextRowCell = table.getValueAt(nextRow, col);
+            if (nextRowCell == ComplexTable.mergeCellY) {
+                mergeRowNum++;
+            } else {
+                break;
+            }
         }
-        return width;
-    }
-    //鏍规嵁鍗曞厓鏍兼墍鍦ㄥ垪寰楀埌x杞村潗鏍�
-    private int getCellX( int column ){
-        int width = 0;
-        TableColumnModel colModel = table.getColumnModel();
-        for( int i = 0 ; i < column ; i++ ){
-            width += colModel.getColumn( i ).getWidth();
-        }
-        return width;
-    }
-    //鏍规嵁鍗曞厓鏍兼墍鍦ㄨ寰楀埌y杞村潗鏍�
-    private int getCellY( int row ){
-        int height = 0;
-        for( int i = 0 ; i < row ; i++ ){
-            height += singleRowHeight;
-        }
-        return height;
+        return mergeRowNum;
     }
 
-    //寰楀埌鍏锋湁鎸囧畾鏂囨湰鐨勬爣绛�
-    private JLabel getComponent(String text){
+    /**
+     * 鑾峰彇鍚堝苟鐨勫垪鏁�
+     */
+    private int getMergeColNum(int row, int col) {
+        int mergeColNum = 1;
+        for (int nextCol = col + 1; nextCol < table.getColumnCount(); nextCol++) {
+            Object nextCell = table.getValueAt(row, nextCol);
+            if (nextCell == ComplexTable.mergeCellX) {
+                mergeColNum++;
+            } else {
+                break;
+            }
+        }
+        return mergeColNum;
+    }
+
+    /**
+     * 鏍规嵁鍚堝苟琛屾暟璁$畻鍗曞厓鏍奸珮搴�
+     */
+    private int getCellHeight(int mergeRowNum) {
+        return mergeRowNum * singleRowHeight;
+    }
+
+    /**
+     * 鏍规嵁鍚堝苟鍒楁暟璁$畻鍗曞厓鏍煎搴�
+     */
+    private int getCellWidth(int col, int mergeColNum) {
+        TableColumnModel colModel = table.getColumnModel();
+        int width = 0;
+        for (int i = 0; i < mergeColNum; i++) {
+            width += colModel.getColumn(col + i).getWidth();
+        }
+        return width;
+    }
+
+    /**
+     * 缁樺埗鍗曞厓鏍�
+     */
+    private void paintCell(Graphics g, Rectangle rect, String text) {
+        Component component = getComponent(text);
+        rendererPane.paintComponent(g, component, table, rect.x, rect.y,
+                rect.width, rect.height, true);
+    }
+
+    /**
+     * 鍒涘缓鐢ㄤ簬缁樺埗鐨勭粍浠�
+     */
+    private JLabel getComponent(String text) {
         JLabel label = new JLabel(text, JLabel.CENTER);
-        Font font = new Font("瀹嬩綋", Font.BOLD, 23);
+        Font font = new Font("瀹嬩綋", Font.PLAIN, 16);
         label.setFont(font);
-        label.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
+        label.setBorder(UIManager.getBorder("Table.cellBorder"));
         return label;
     }
-
-    private void paintCell(Graphics g, Rectangle cellRect , String text) {
-        Component component = this.getComponent(text);
-        rendererPane.paintComponent(g, component, table, cellRect.x, cellRect.y,
-                cellRect.width, cellRect.height, true);
-    }
-
-}
-
+}
\ No newline at end of file

--
Gitblit v1.9.1