java - 带有单元格闪烁的 JTable

标签 java swing timer jtable renderer

我正在使用 Java 中的 Swing 库编写应用程序。我有一个扩展 JTable 的表格组件,在这个组件中我覆盖了方法 getTableCellRendererComponent,因为我为表格的单元格着色。我有一个自定义表格模型(从默认表格模型扩展而来),表格组件本身已添加到 JPanel。所有这些都有效。

现在我想在此表中添加一些功能,使单元格闪烁。可能一次闪烁不止一个单元格,即位于(第 1 行,第 2 列)和(第 3 行,第 4 列)的单元格。

这可能吗?任何可以让我开始的提示都将不胜感激。

最佳答案

我找到一篇文章来回答你:

http://www.devx.com/DevX/10MinuteSolution/17167/0/page/1

该页面提供源代码供下载。

基本上它使用以下方法通知表及时更新单元格。

JTable.tableChanged(new TableModelEvent(table.getModel(), firstRow, lastRow, column));

看完他的代码,我整理了一个他的代码更简单的版本,你可以改我的代码或者使用他的代码(更优雅但也更复杂)。

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;
        }
    }
}

关于java - 带有单元格闪烁的 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10735758/

相关文章:

android - 当 Activity 不在前面时暂停Android中的CountDownTimer

java - 使用 Java 计算标准差?

c# - Timer.Interval 问题

c++ - 随着时间 SFML C++ 移动时每隔几秒 Sprite

java - 不同类(class)的 JPanel,是我做的不好吗?为什么?

java - 在一个程序中使用多个 Swing 定时器是不是很糟糕

java - JTable : Adding one to a JPanel, 并且它不显示自身

java - 按下一步显示下一条记录

java - 在构造函数中使用重写方法的替代方法,Java

java - IText 中应该存在但无法识别的符号