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);
我真的不知道如何用语言来解释这个。所以我有一个带有 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);