gpt4 book ai didi

Java JTable 禁用单个单元格选择边框突出显示

转载 作者:搜寻专家 更新时间:2023-11-01 01:10:29 25 4
gpt4 key购买 nike

我有一个每行三列的 JTable,请看图片:

enter image description here

出于某种原因,根据我选择的列,我在上图中得到了它周围的深蓝色小边框 (V140116554)。

我目前使用它来选择整行:

vTable.setRowSelectionAllowed(true);

我怎样才能禁用它?

编辑:

添加了一个类:

public class VisitorRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
setBorder(noFocusBorder);
return this;
}
}

并添加了它:

vTable.setDefaultRenderer(String.class, new VisitorRenderer());

但还是得到了边框

最佳答案

TableCellRenderer 负责在当前获得焦点的单元格周围绘制焦点矩形。您需要提供自己的渲染器,该渲染器能够覆盖此功能或提供自己的...

例如;

public class MyRenderer extends DefaultTableCellRenderer {

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

}

这使用 DefaultTableCellRenderer 作为基础渲染器,并将组件的 Border 设置为 noFocusBorder,它在 DefaultTableCellRenderer 中定义> 作为 EmptyBorder

然后您需要将此渲染器设置为受影响列的默认渲染器。查看How to use tables了解更多详情

用例子更新

对我来说很好用...

enter image description here

import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class TableRenderer {

public static void main(String[] args) {
new TableRenderer();
}

public TableRenderer() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

DefaultTableModel model = new DefaultTableModel(new Object[][]{{"", "One"}, {"", "Two"}}, new Object[]{"Check", "Vistor"}) {
@Override
public Class<?> getColumnClass(int columnIndex) {
return String.class;
}
};

JTable table = new JTable(model);
table.setRowSelectionAllowed(true);
table.setShowGrid(false);
table.setDefaultRenderer(String.class, new VisitorRenderer());

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class VisitorRenderer extends DefaultTableCellRenderer {

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

为了确定,我将 setBorder(noFocusBorder); 更改为...

if (hasFocus) {
setBorder(new LineBorder(Color.RED));
}

enter image description here

从表面上看,TableModel 并未将访问者列类类型报告为 String...

更新了代理渲染器概念

因为你想移除每个单元格的焦点边框。你有三个选择...

  1. 为表格可能需要的每种可能的 Class 类型编写自定义单元格渲染器。这可能很耗时,并且需要重复大量代码才能达到很小的效果。
  2. 什么都不做……
  3. 使用“代理”渲染器。这是一个渲染器,它使用另一个 TableCellRenderer 来执行实际的渲染过程,但会对结果应用一些小的更改,例如,删除边框...

...

public static class ProxyCellRenderer implements TableCellRenderer {

protected static final Border DEFAULT_BORDER = new EmptyBorder(1, 1, 1, 1);
private TableCellRenderer renderer;

public ProxyCellRenderer(TableCellRenderer renderer) {
this.renderer = renderer;
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component comp = renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (comp instanceof JComponent) {
((JComponent)comp).setBorder(DEFAULT_BORDER);
}
return comp;
}
}

而不是做类似...

table.setDefaultRenderer(String.class, new VisitorRenderer());

我们以前做过的,我们会这样做...

table.setDefaultRenderer(String.class, 
new ProxyCellRenderer(table.getDefaultRenderer(String.class)));

这意味着我们可以在不知道可能是什么的情况下利用已经可用的默认渲染器,但也可以为其提供我们自己的自定义要求...

关于Java JTable 禁用单个单元格选择边框突出显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18801137/

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