JTable 中的 JButton Icon/Animation 按下时更改

JButton within JTable Icon/Animation Changing When Pressed

我真的不知道如何用语言来解释这个。所以我有一个带有 JButton 列的 JTable。我已经为此按钮设置了一个图标,但是当我按下或按住该按钮时,它会变成您在下面看到的图像。

如何禁用此效果?我尝试了以下无济于事:

  renderButton.setContentAreaFilled(false);
  renderButton.setIcon(new ImageIcon(ButtonColumn.class
                .getResource("/com/graphics/clear_left.png")));
  renderButton.setRolloverIcon(new ImageIcon(ButtonColumn.class
                .getResource("/com/graphics/clear_left.png")));
  renderButton.setRolloverSelectedIcon(new ImageIcon(ButtonColumn.class
                .getResource("/com/graphics/clear_left.png")));
  renderButton.setPressedIcon(new ImageIcon(ButtonColumn.class
                .getResource("/com/graphics/clear_left.png")));

根据您的代码,我认为您使用 Rob Camick 的 ButtonColumn to get the buttons column decoration. That class implements both TableCellRenderer and TableCellEditor 接口为您指定的列中的单元格提供 JButton 作为渲染器和编辑器,在您的例子中是最后一个。

您所做的是自定义渲染器按钮以显示您想要的图标,但现在您还必须自定义编辑器按钮以覆盖默认按钮的外观。

在这两种情况下,我都不会直接修改 source code,而是覆盖两个 getTableCellXxxComponent(...) 方法,就像任何其他自定义 renderer/editor 一样。这样的事情会成功:

JTable table = new JTable(tableModel);

Action action = new AbstractAction() {...};

ButtonColumn buttonColumn = new ButtonColumn(table, action, 5) {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        JButton button = (JButton)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        button.setContentAreaFilled(false);
        button.setBorder(BorderFactory.createEmptyBorder());
        // Customize the icon and whatever you want here
        return button;
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        JButton button = (JButton)super.getTableCellEditorComponent(table, value, isSelected, row, column);
        button.setContentAreaFilled(false);
        // Customize the icon and whatever you want here
        return button;
    }
};

备注

始终将 link 添加到非标准库或 类。否则,人们将无法在 类 他们不熟悉的方面为您提供帮助。

正如@mKorbel 指出的那样,用于呈现第 5 列的 JSpinner 不完整:如果选择了单元格,则应应用选择背景色(参见第一行)。

我也不能使用 ButtonColumn,我找到了另一种方法来完成这项工作:将 mouseListener 添加到 jTable 和 return 单击单元格的位置。

Rectangle[] cells;
for(int i=0;i<row;i++){cells[i] = Table_Skill.getCellRect(i, 7, false);}

MouseListener ml = new MouseListener(){
    @Override
    public void mouseClicked(MouseEvent e){
        Point point_clicked = new Point(e.getX(),e.getY());
            for(int i=0;i<row;i++){
                if(cells[i].contains(point_clicked))
                {
                //some action like deleting the row
                break;
                }
            }
    }
    @Override
    public void mousePressed(MouseEvent e) {}
    @Override
    public void mouseReleased(MouseEvent e) {}
    @Override
    public void mouseEntered(MouseEvent e) {}
    @Override
    public void mouseExited(MouseEvent e) {}
};
Table_Skill.addMouseListener(ml);