Java JTable鼠标单击时更改单元格背景-发布后是否更改背景?
我的问题是,如何解决以下问题: 如果单击JTable中的单元格,我想更改其背景。如果我松开鼠标按钮,我希望背景颜色变回正常颜色 可能吗Java JTable鼠标单击时更改单元格背景-发布后是否更改背景?,java,swing,jtable,Java,Swing,Jtable,我的问题是,如何解决以下问题: 如果单击JTable中的单元格,我想更改其背景。如果我松开鼠标按钮,我希望背景颜色变回正常颜色 可能吗 问候ayk在渲染器中,您必须覆盖hasFocus 比如说 import java.awt.*; import java.util.*; import javax.swing.*; import javax.swing.table.*; public class TableRenderer extends JFrame { private static
问候ayk在渲染器中,您必须覆盖hasFocus 比如说
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableRenderer extends JFrame {
private static final long serialVersionUID = 1L;
private JTable table;
private String[] columnNames = {"Date", "String", "Centered", "Integer", "Boolean"};
private Object[][] data = {
{new Date(), "A", "A", new Integer(1), true},
{new Date(), "B", "B", new Integer(2), false},
{new Date(), "C", "C", new Integer(10), null},
{new Date(), "D", "D", new Integer(4), false}
};
public TableRenderer() {
DefaultTableModel model = new DefaultTableModel(data, columnNames);
table = new JTable(model) {
private static final long serialVersionUID = 1L;
// Returning the Class of each column will allow different
// renderers to be used based on Class
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
getContentPane().add(scrollPane);
// Override default renderer on a specific Class
TableCellRenderer colorRenderer = new ColorRenderer();
table.setDefaultRenderer(String.class, colorRenderer);
// Override default renderer for a specific column
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment(JLabel.CENTER);
table.getColumnModel().getColumn(2).setCellRenderer(centerRenderer);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
TableRenderer frame = new TableRenderer();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
/*
** Color the focused cell
*/
private class ColorRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (hasFocus) {
setBackground(Color.cyan);
} else if (isSelected) {
setBackground(table.getSelectionBackground());
} else {
setBackground(table.getBackground());
}
return this;
}
}
}
是的,这是可能的。
使用自定义设置并将JTable设置为使用:
这里有一个。用于在您需要的视觉领域中执行此操作
- 一种鼠标侦听器,按下时在单元格坐标中设置某些状态,释放时重置该状态
- PropertyChangeListener将侦听更改时重新绘制单元格的状态
- 自定义渲染器,为标记的单元格设置自定义背景
MouseListener l = new MouseAdapter() {
/**
* @inherited <p>
*/
@Override
public void mousePressed(MouseEvent e) {
JTable table = (JTable) e.getComponent();
int col = table.columnAtPoint(e.getPoint());
int row = table.rowAtPoint(e.getPoint());
if (col < 0 || row < 0) {
table.putClientProperty("pressedCell", null);
} else {
table.putClientProperty("pressedCell", new Point(col, row));
}
}
/**
* @inherited <p>
*/
@Override
public void mouseReleased(MouseEvent e) {
((JTable) e.getComponent()).putClientProperty("pressedCell", null);
}
};
table.addMouseListener(l);
PropertyChangeListener property = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
JTable table = (JTable) evt.getSource();
Point cell = evt.getNewValue() != null ?
(Point) evt.getNewValue() : (Point) evt.getOldValue();
if (cell != null) table.repaint(table.getCellRect(cell.y, cell.x, false));
}
};
table.addPropertyChangeListener("pressedCell", property);
对于core Swing,要么实现一个自定义TableCellRenderer,要么对JTable和override prepareRenderer进行子类化,以根据单元格标志设置背景颜色,如Rob的中所述,如果我使用defaultcellrenderer?+1,您有一个小示例:另一种方式,而不是ListSelectionModel。我不知道这是否是最好的解决方案。@0verbose hmmm只是我确信这是一条很短的路,+1,但另一个来自您的历史记录的问题,关于JTable中不可排序的行有什么消息吗,您有什么进展吗???,对于您在此处发布的提示,需要实现这个@mKorbel:我用一个变通方法解决了这个问题,我不记得是如何解决的:)。我正在看代码,我知道,我找不到它。谢谢你的代码,但这不正是我要找的。也许我的解释不够清楚。我需要的是像按钮一样思考的行为。例如,如果我单击单元格并按住鼠标按钮,颜色应该变为青色,但如果我松开按钮,颜色会变回青色。问候aykwhy在JTable(和sooo,非常重)和MouseListener上添加了另一个侦听器,使事情变得复杂,它每秒生成超过1000个事件,1)并不是相反的结果,那么渲染器可能会更轻,也就是侦听器,2)同意是否存在不可压缩的HightLighter,然后有另一个侦听器可能不会生成预期事件..+1:你是对的。这是用户正在寻找的。也很有趣,我从没听过彩色荧光笔before@Overbose这是一个SwingX荧光笔:-)(该死,我以为我一小时前就发了这条评论,有时这个系统会让我抓狂…“等待15秒,等待下一条评论”)@mKorbel,因为看似简单的解决方案(正如你和过量药物所建议的)不符合要求,所以这根本不是一个解决方案:-)@kleopatra 1)系统让我抓狂-FW问题2)你能具体一点吗,因为在这里实现,在那里实现,没有明确的-->:-),3)真正唯一的方法是实现MouseAdapter&Point@0verbose确保周一的情况更糟:-)
HighlightPredicate predicate = new HighlightPredicate() {
@Override
public boolean isHighlighted(Component renderer, ComponentAdapter adapter) {
Point p = (Point) adapter.getComponent().getClientProperty("pressedCell");
return p != null && p.x == adapter.column && p.y == adapter.row;
}
};
table.addHighlighter(new ColorHighlighter(predicate, Color.YELLOW, null, Color.YELLOW, null));