如何在鼠标进入时更改一行中所有JTable列的颜色?
How to change all JTable column color in a row when mouse entered?
我希望当鼠标进入 table 中的一行时,我希望该行中的每一列颜色都变为蓝色。
我已经这样做了,它发生了变化,但是只有当我按下鼠标时它才会发生变化,而不是当我的鼠标进入它时发生变化。
private void changeColorTableCell(JTable tbl, int index) {
tbl.getColumnModel().getColumn(index).setCellRenderer(new DefaultTableCellRenderer(){
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
final Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
c.setBackground(Color.BLUE);
return c;
}
});
}
private void tabelPesananMouseEntered(java.awt.event.MouseEvent evt) {
int count = tabelPesanan.getColumnModel().getColumnCount();
for(int i = 0; i < count; i++) {
changeColorTableCell(tabelPesanan, i);
}
}
当鼠标进入时如何改变所有 JTable
列的颜色?
getColumn(index).setCellRenderer(…)
不行。如果你想改变整行的颜色,你不能只改变一列的渲染器。
虽然您可以设置默认渲染器,或者可以设置每列的单元格渲染器,但更好的选择是覆盖 prepareRenderer,这样除了背景颜色外,任何其他渲染器都不会受到影响。
private int hoveredRow = -1;
// ...
JTable tabelPesanan = new JTable() {
private static final long serialVersionUID = 1;
@Override
public Component prepareRenderer(TableCellRenderer renderer,
int row,
int column) {
Component component =
super.prepareRenderer(renderer, row, column);
if (row == hoveredRow) {
component.setBackground(Color.BLUE);
} else if (isCellSelected(row, column)) {
component.setBackground(getSelectionBackground());
} else {
component.setBackground(getBackground());
}
return component;
}
};
MouseInputListener hoveredRowUpdater = new MouseInputAdapter() {
private void repaintRow(int row) {
if (row >= 0) {
Rectangle bounds = tabelPesanan.getCellRect(row, 0, true);
int width = tabelPesanan.getWidth();
tabelPesanan.repaint(0, bounds.y, width, bounds.height);
}
}
private void updateHoveredRowFrom(MouseEvent event) {
int oldHoveredRow = hoveredRow;
hoveredRow = tabelPesanan.rowAtPoint(event.getPoint());
repaintRow(oldHoveredRow);
repaintRow(hoveredRow);
}
@Override
public void mouseEntered(MouseEvent event) {
updateHoveredRowFrom(event);
}
@Override
public void mouseExited(MouseEvent event) {
updateHoveredRowFrom(event);
}
@Override
public void mouseMoved(MouseEvent event) {
updateHoveredRowFrom(event);
}
@Override
public void mouseDragged(MouseEvent event) {
updateHoveredRowFrom(event);
}
};
tabelPesanan.addMouseListener(hoveredRowUpdater);
tabelPesanan.addMouseMotionListener(hoveredRowUpdater);
我希望当鼠标进入 table 中的一行时,我希望该行中的每一列颜色都变为蓝色。
我已经这样做了,它发生了变化,但是只有当我按下鼠标时它才会发生变化,而不是当我的鼠标进入它时发生变化。
private void changeColorTableCell(JTable tbl, int index) {
tbl.getColumnModel().getColumn(index).setCellRenderer(new DefaultTableCellRenderer(){
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
final Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
c.setBackground(Color.BLUE);
return c;
}
});
}
private void tabelPesananMouseEntered(java.awt.event.MouseEvent evt) {
int count = tabelPesanan.getColumnModel().getColumnCount();
for(int i = 0; i < count; i++) {
changeColorTableCell(tabelPesanan, i);
}
}
当鼠标进入时如何改变所有 JTable
列的颜色?
getColumn(index).setCellRenderer(…)
不行。如果你想改变整行的颜色,你不能只改变一列的渲染器。
虽然您可以设置默认渲染器,或者可以设置每列的单元格渲染器,但更好的选择是覆盖 prepareRenderer,这样除了背景颜色外,任何其他渲染器都不会受到影响。
private int hoveredRow = -1;
// ...
JTable tabelPesanan = new JTable() {
private static final long serialVersionUID = 1;
@Override
public Component prepareRenderer(TableCellRenderer renderer,
int row,
int column) {
Component component =
super.prepareRenderer(renderer, row, column);
if (row == hoveredRow) {
component.setBackground(Color.BLUE);
} else if (isCellSelected(row, column)) {
component.setBackground(getSelectionBackground());
} else {
component.setBackground(getBackground());
}
return component;
}
};
MouseInputListener hoveredRowUpdater = new MouseInputAdapter() {
private void repaintRow(int row) {
if (row >= 0) {
Rectangle bounds = tabelPesanan.getCellRect(row, 0, true);
int width = tabelPesanan.getWidth();
tabelPesanan.repaint(0, bounds.y, width, bounds.height);
}
}
private void updateHoveredRowFrom(MouseEvent event) {
int oldHoveredRow = hoveredRow;
hoveredRow = tabelPesanan.rowAtPoint(event.getPoint());
repaintRow(oldHoveredRow);
repaintRow(hoveredRow);
}
@Override
public void mouseEntered(MouseEvent event) {
updateHoveredRowFrom(event);
}
@Override
public void mouseExited(MouseEvent event) {
updateHoveredRowFrom(event);
}
@Override
public void mouseMoved(MouseEvent event) {
updateHoveredRowFrom(event);
}
@Override
public void mouseDragged(MouseEvent event) {
updateHoveredRowFrom(event);
}
};
tabelPesanan.addMouseListener(hoveredRowUpdater);
tabelPesanan.addMouseMotionListener(hoveredRowUpdater);