Java 单元闪烁JTable
我正在用Java中的Swing库编写一个应用程序。我有一个扩展了Java 单元闪烁JTable,java,swing,timer,jtable,renderer,Java,Swing,Timer,Jtable,Renderer,我正在用Java中的Swing库编写一个应用程序。我有一个扩展了JTable的表组件,在这个组件中我重写了方法gettableCellRenderComponent,因为我给表的单元格着色。我有一个自定义表模型(从默认表模型扩展而来),以及我添加到JPanel的表组件本身。所有这些都有效 现在,我想在此表中添加一些功能,以使单元格闪烁。一次可能有多个单元格闪烁,即(第1行第2列)和(第3行第4列)的单元格 这可能吗?任何能让我开始的提示都将不胜感激。我找到一篇文章作为您的答案: 该页面提供了可
JTable
的表组件,在这个组件中我重写了方法gettableCellRenderComponent
,因为我给表的单元格着色。我有一个自定义表模型(从默认表模型扩展而来),以及我添加到JPanel的表组件本身。所有这些都有效
现在,我想在此表中添加一些功能,以使单元格闪烁。一次可能有多个单元格闪烁,即(第1行第2列)和(第3行第4列)的单元格
这可能吗?任何能让我开始的提示都将不胜感激。我找到一篇文章作为您的答案: 该页面提供了可供下载的源代码 基本上,它使用以下方法通知表以及时更新单元格
JTable.tableChanged(new TableModelEvent(table.getModel(), firstRow, lastRow, column));
在阅读了他的代码之后,我整理出了他的代码的一个更简单的版本,您可以更改我的代码或使用他的代码(更优雅但也更复杂)
是的,是可能的,没有什么特别的,编辑你的问题,并展示你的问题,但阅读后,我会使用一个听众。我认为ActualListNead会做一些技巧,ActListListar会使它闪烁,你必须使用像计时器这样的东西来获得这个DONE,而单元闪烁是可能的,考虑其他方面,比如改变背景颜色。它可能更方便用户。如果使用闪烁,只需创建一个计时器,并在每个勾号上闪烁相应的单元格。
Random
用于生成Color
&摆动计时器
&XxxRenderer
,或者可以使用Runnable#Thread
更改(更好、更简单的方式)摆动计时器
,处理Thread.sleep(int)
顺便说一句,这个例子就是摆幅定时器存在的原因+1@mKorbel感谢您的投票,还有一个小问题,我是否需要将table.tableChanged()转换为SwingUtilities.invokeLater()?感谢基本上Swing对线程一无所知,那么所有(从线程)到非线程安全方法(如setText、appent)的输出都不在EDT范围内,答案是“是”,是必需的,而且它最安全,Swing计时器是最好的方法,而不是使用线程和线程。Sleep(int)我认为如果您使用Swing计时器,它将为您处理事件线程中的计时器触发。
public class FlashCellTable
{
public static Color color;
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setSize(800, 600);
final JTable table = new JTable(4, 4);
table.setDefaultRenderer(Object.class, new MyFlashingCellRenderer());
table.setValueAt("Flashing", 0, 0);
frame.getContentPane().add(new JScrollPane(table));
final long startTime = System.currentTimeMillis();
Thread thread = new Thread()
{
@Override
public void run()
{
while (true)
{
long now = System.currentTimeMillis();
long second = (now - startTime) / 1000;
color = second / 2 * 2 == second ? Color.red : Color.blue;
System.out.println("FlashCellTable.run");
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
table.tableChanged(new TableModelEvent(table.getModel(), 0, 0, 0));
}
});
try
{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
};
thread.start();
frame.setVisible(true);
}
public static class MyFlashingCellRenderer extends DefaultTableCellRenderer
{
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column)
{
JLabel label =
(JLabel)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if ("Flashing".equals(value))
{
label.setBackground(color);
}
else
{
label.setBackground(Color.white);
}
return label;
}
}
}