我正在使用 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在同一台电脑上。
在其他方法中,要使用以下方法设置标题单元格的尺寸:
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));标题正在移动。