我真的不知道如何用语言解释这一点。所以我有一个带JButton Column的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")));
答案 0 :(得分:7)
根据您的代码,我认为您使用Rob Camick的ButtonColumn来获取按钮列装饰。该类实现TableCellRenderer和TableCellEditor接口,为您指定的列中的单元格提供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);