[英]How can to create a rollover effect in a JTable?
在我的應用程序中,我想用JTable的行創建過渡效果。 例如,當鼠標進入該行時,該行的背景顏色將改變; 相反,當鼠標退出該行時,該行的顏色將恢復正常。
我怎樣才能做到這一點?
使用下面的代碼,這將為您提供關於對JTable的行應用翻轉效果的想法。
import java.awt.Component;
import java.awt.event.MouseEvent;
import javax.swing.*;
import javax.swing.event.MouseInputAdapter;
import javax.swing.table.*;
public class RollOverTable extends JTable {
private int rollOverRowIndex = -1;
public RollOverTable(TableModel model) {
super(model);
RollOverListener lst = new RollOverListener();
addMouseMotionListener(lst);
addMouseListener(lst);
}
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
if( isRowSelected(row) || (row == rollOverRowIndex) ) {
c.setForeground(getSelectionForeground());
c.setBackground(getSelectionBackground());
}
else {
c.setForeground(getForeground());
c.setBackground(getBackground());
}
return c;
}
private class RollOverListener extends MouseInputAdapter {
public void mouseExited(MouseEvent e) {
rollOverRowIndex = -1;
repaint();
}
public void mouseMoved(MouseEvent e) {
int row = rowAtPoint(e.getPoint());
if( row != rollOverRowIndex ) {
rollOverRowIndex = row;
repaint();
}
}
}
}
如果表格有很多行,並且我們使用鼠標滾輪滾動表格,上述答案將不起作用。 鼠標將位於新行上,但是鼠標懸停效果仍將位於舊行上。
這是我為解決問題而進行的修改。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.MouseInputAdapter;
import javax.swing.table.*;
public class RollOverTable extends JTable {
private Color rollOverBackground = new Color(233,239,248);
private Color rollOverForeground = UIManager.getDefaults().getColor("windowText");
private int rollOverRowIndex = -1;
private boolean dispatchedEvent = false;
private RollOverListener lst = null;
private JScrollPane scp = null;
public RollOverTable(TableModel model) {
super(model);
lst = new RollOverListener();
addMouseMotionListener(lst);
addMouseListener(lst);
addMouseWheelListener(lst);
}
public Color getRollOverBackground() {
return rollOverBackground;
}
public void setRollOverBackground(Color value) {
rollOverBackground = value;
}
public Color getRollOverForeground() {
return rollOverForeground;
}
public void setRollOverForeground(Color value) {
rollOverForeground = value;
}
@Override
public void addNotify() {
super.addNotify();
for (Component c = this; c != null; c = c.getParent())
if (c instanceof JScrollPane) {
scp = (JScrollPane) c;
scp.addMouseWheelListener(new RollOverMouseWheelListener(this));
break;
}
}
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
if (isRowSelected(row)) {
c.setForeground(getSelectionForeground());
c.setBackground(getSelectionBackground());
} else if (row == rollOverRowIndex) {
c.setForeground(getRollOverForeground());
c.setBackground(getRollOverBackground());
} else {
c.setForeground(getForeground());
c.setBackground(getBackground());
}
return c;
}
protected void repaintRow(int row) {
if (row == -1) return;
int modelRow = convertRowIndexToModel(row);
((AbstractTableModel)getModel()).fireTableRowsUpdated(modelRow, modelRow);
}
private class RollOverListener extends MouseInputAdapter {
@Override
public void mouseExited(MouseEvent e) {
if (rollOverRowIndex != -1) {
repaintRow(rollOverRowIndex);
rollOverRowIndex = -1;
}
}
@Override
public void mouseMoved(MouseEvent e) {
int row = rowAtPoint(e.getPoint());
if (row != rollOverRowIndex) {
repaintRow(rollOverRowIndex);
rollOverRowIndex = row;
repaintRow(rollOverRowIndex);
}
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
if (rollOverRowIndex != -1) {
repaintRow(rollOverRowIndex);
rollOverRowIndex = -1;
dispatchedEvent = true;
scp.dispatchEvent(SwingUtilities.convertMouseEvent(
e.getComponent(), e, scp));
}
}
}
private class RollOverMouseWheelListener extends MouseInputAdapter {
private final RollOverTable table;
public RollOverMouseWheelListener(RollOverTable table) {
this.table = table;
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
if (dispatchedEvent) {
dispatchedEvent = false;
Point point = SwingUtilities.convertPoint(
e.getComponent(), e.getPoint(), table);
int row = table.rowAtPoint(point);
if (rollOverRowIndex != row) {
rollOverRowIndex = row;
table.repaintRow(rollOverRowIndex);
}
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.