gpt4 book ai didi

java - 使用自定义呈现突出显示 JTable 中的行选择

转载 作者:行者123 更新时间:2023-11-30 08:08:56 25 4
gpt4 key购买 nike

我正在通过扩展 DefaultTableCellRenderer 使用自定义表格单元格渲染器创建 JTable,我想在其中使用一些图像和文本。

enter image description here

正如您在上面看到的,即使我选择了特定的行,它也没有在 Testcases 列中突出显示。我已经尝试了一些现有的 SO 问题( Q1Q2 )解决方案,但仍然无法正常工作。我在哪里犯了错误?

JTableTest.java

import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class JTableTest extends JFrame {

public DefaultTableModel testcaseModel;
public JTable testcasesTable;
Object[] testcaseTableColumns = {"S.No", "Testcases"};
public static final int TESTCASE_SNO_COLUMN = 0;
public static final int TESTCASE_NAME_COLUMN = 1;

public JTableTest() {
initComponents();
}

private void initComponents() {
if (testcaseModel == null) {
testcaseModel = new DefaultTableModel(null, testcaseTableColumns){

@Override
public Class<?> getColumnClass(int columnIndex) {
// if (columnIndex == -1) {
// return Integer.class;
// } else if(columnIndex==1){
// return JLabel.class;
// }
return Object.class;
}

};
}
if (testcasesTable == null) {
testcasesTable = new JTable(testcaseModel) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
}
testcasesTable.setCellSelectionEnabled(true);
testcasesTable.getColumnModel().getColumn(TESTCASE_NAME_COLUMN).setCellRenderer(new LabelRenderer());
for (int i = 0; i < 10; i++) {
testcaseModel.addRow(new Object[]{i, (i * 100)});
}
}

public static void main(String[] args) {
JTableTest jTableTest = new JTableTest();
jTableTest.setSize(300, 300);
jTableTest.setTitle("TableIcon");
jTableTest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel pnlMain = new JPanel(new BorderLayout(10, 10));
JScrollPane scrollPane = new JScrollPane(jTableTest.testcasesTable);
pnlMain.add(scrollPane);
jTableTest.getContentPane().add(pnlMain);
jTableTest.setVisible(true);

}

}

LabelRenderer.java

import java.awt.Component;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.table.DefaultTableCellRenderer;


public class LabelRenderer extends DefaultTableCellRenderer {

public static final Border focusedCellBorder = UIManager.getBorder("Table.focusCellHighlightBorder");

public static final Border unfocusedCellBorder = createEmptyBorder();

private static Border createEmptyBorder() {
Insets i = focusedCellBorder.getBorderInsets(new JLabel());
return BorderFactory.createEmptyBorder(i.top, i.left, i.bottom, i.right);
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

String text = value.toString();
JLabel label = new JLabel(text);

try {
label.setIcon(new ImageIcon(getClass().getResource("ok_16px.png")));
// This below code setting the border to be highlighted, but not whole
label.setBorder(hasFocus ? focusedCellBorder : unfocusedCellBorder);

} catch (Exception ex) {
System.out.println(ex);
}
// This also not working.....
if (isSelected) {
label.setBackground(table.getSelectionBackground());
label.setForeground(table.getSelectionForeground());
} else {
label.setBackground(table.getBackground());
label.setForeground(table.getForeground());
}
return label;
}
}

最佳答案

不要在 TableCellEditor 中创建另一个 JLabelDefaultTableCellEditor 已经从 JLabel 扩展,您只需应用您需要的设置,留下 DefaultTableCellRenderer 来处理其余的

Selected

public class LabelRenderer extends DefaultTableCellRenderer {

public static final Border focusedCellBorder = UIManager.getBorder("Table.focusCellHighlightBorder");

public static final Border unfocusedCellBorder = createEmptyBorder();

private static Border createEmptyBorder() {
Insets i = focusedCellBorder.getBorderInsets(new JLabel());
return BorderFactory.createEmptyBorder(i.top, i.left, i.bottom, i.right);
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

String text = value.toString();

try {
setIcon(new ImageIcon(getClass().getResource("ok_16px.png")));
// This below code setting the border to be highlighted, but not whole

} catch (Exception ex) {
System.out.println(ex);
}
setBorder(hasFocus ? focusedCellBorder : unfocusedCellBorder);

return this;
}
}

另请注意,启用 cellSelection 后,您需要单击第二列中的单元格才能看到突出显示。关闭它以允许整行选择

关于java - 使用自定义呈现突出显示 JTable 中的行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32837602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com