JTable图标中的JButton /按下时动画变化

时间:2015-02-11 10:44:18

标签: java swing jtable jbutton tablecellrenderer

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

enter image description here

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

  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")));

2 个答案:

答案 0 :(得分:7)

根据您的代码,我认为您使用Rob Camick的ButtonColumn来获取按钮列装饰。该类实现TableCellRendererTableCellEditor接口,为您指定的列中的单元格提供JButton作为渲染器和编辑器,在您的情况下是最后一个。

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

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

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;
    }
};

注释

始终包含指向非标准库或类的链接。否则,人们就无法帮助你完成他们不熟悉的课程。

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

答案 1 :(得分:0)

我也不能使用ButtonColumn而且我找到了另一种方法来完成这项工作:向mouseListener添加jTable并按其位置返回点击的单元格。

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);