Java JTable 标题在滚动时不水平移动

问题描述 投票:0回答:1

我正在使用 java 8,并将应用程序编译为可运行的 jar,其中包含所有依赖项。

我正在创建一个表格并添加标题和内容。当渲染 JScrollPane 时,两者都是可见的,但是当滚动时,标题不会沿着数据单元格水平移动,只会沿着表的数据行移动。

在我的代码下面:

public JScrollPane getTableScrollPaneWithTable(CellData[][] toBeShown, String[] headers, int panelWidth,
            int parentHeight) {
        DefaultTableModel tableModel = new DefaultTableModel(toBeShown, headers);


         
     this.parent.getInfoResponse().getPositionSetOfConfigDIDsInTheDataMatrix().clear();
        
        
        
        JTable table = new JTable(tableModel) {
            /**
             * 
             */
            private static final long serialVersionUID = 1L;


            @Override
            public TableCellRenderer getCellRenderer(int row, int column) {
                if (column == 0 || row == 0 || row == 1) {
                    HeaderColumnRenderer hcr = new HeaderColumnRenderer(this.getTableHeader().getDefaultRenderer());
                    return hcr;
                }
                CellData[][] dataShowed = getDataShowed();
                return new MultiColorRenderer(dataShowed);
            }


            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }


        };
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        
        table.setCellSelectionEnabled(true);
        table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        
        int colCount = table.getColumnModel().getColumnCount();
        for(int i=0; i< colCount; i++) {
            if(i==0) {
                table.getColumnModel().getColumn(i).setPreferredWidth(80);
                continue;
            }
            table.getColumnModel().getColumn(i).setPreferredWidth(250);
        }
        
        
        
        table.addKeyListener(new KeyListener() {


            @Override
            public void keyTyped(KeyEvent e) {
                // TODO Auto-generated method stub
                
            }


            @Override
            public void keyPressed(KeyEvent e) {
                // TODO Auto-generated method stub
                
            }


            @Override
            public void keyReleased(KeyEvent e) {
                
                if(e.getKeyCode()==KeyEvent.VK_C) {
                    //System.out.println("Copy event");
                    int[] selectedColumns = table.getSelectedColumns();
                    int[] selectedRows = table.getSelectedRows();
                    MainWindow parent = getParent();
                    CellData[][] toShow = parent.getCellDataShowed();
                    StringBuffer sb = new StringBuffer();
                    for(int i =0; i <selectedRows.length; i++) {
                        int mRow =  selectedRows[i];
                        StringBuffer colBuffer = new StringBuffer();
                        for(int j= 0;j <selectedColumns.length; j++) {
                            int mCol =  selectedColumns[j];
                            CellData cd = toShow[mRow][mCol];
                            if(j>0) {
                                colBuffer.append("\t");
                            }
                            if(cd==null || cd.getRawContent()==null) {
                                colBuffer.append(" ");
                            } else {
                                colBuffer.append(cd.getRawContent());
                            }
                            
                            
                        }
                        sb.append(colBuffer.toString() + "\n");
                    }
                    Clipboard cp = Toolkit.getDefaultToolkit().getSystemClipboard();
                    StringSelection ss = new StringSelection(sb.toString());
                    cp.setContents(ss, null);
                }
            }
            
        });
        
        setMouseListener(table, parent, parent.getEngine());
        setMouseListenerOnHeader(table, parent, parent.getEngine());


        JScrollPane sp = new JScrollPane(table);
    
        sp.setBounds(10, 30, panelWidth, parentHeight - 70);
        sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        return sp;
    }

当我使用 java 17 编译它时,它可以完美运行,但我需要使用 java 8 来与团队中没有 java 17 或不知道如何安装它的其他人兼容,或者配置两个 JDK 或 JRE在同一台电脑上。

java swing java-8 jtable
1个回答
0
投票

在其他方法中,要使用以下方法设置标题单元格的尺寸:

table.getTableHeader().setPreferrredSize(new Dimension(400,30));

当向左或向右滚动时,它使标题单元格处于固定位置。 我将其删除并修改了 HeaderColumnRendererClass 并在下面的代码中添加了 c instanceof JComponent 的子句:

@Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                                                   boolean hasFocus, int row, int column) {
        if (value != null && value instanceof String && ((String) value).startsWith("<html>")) {
            // Do nothing
        } else if (value instanceof CellData) {
            CellData cd = (CellData) value;
            value = cd.getRawContent();
        } else {
            // Do nothing
        }

        Component c = headerRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        // Set custom height for the header cell
        if (c instanceof JComponent) {
            ((JComponent) c).setPreferredSize(new Dimension(c.getPreferredSize().width, 30)); // Change 30 to your desired height
        }

        return c;
    }
}

现在标题沿着内容单元格左右移动。

Java 17 对于相同的代码没有相同的行为,其中有 table.getTableHeader().setPreferrredSize(new Dimension(400,30));标题正在移动。

© www.soinside.com 2019 - 2024. All rights reserved.