JTable с прошивкой ячейки

Я пишу приложение, используя библиотеку Swing на Java. У меня есть компонент таблицы, который расширяет JTable, и в этом компоненте я переопределил метод getTableCellRendererComponent, потому что я окрашиваю ячейки таблицы. У меня есть настраиваемая модель таблицы (которая расширяет модель таблицы по умолчанию) и сам компонент таблицы, который я добавил в JPanel. Все это работает.

Теперь я хотел бы добавить к этой таблице некоторые функции, чтобы ячейка мигала. Потенциально одновременно может мигать более одной ячейки, то есть ячейки в (строка 1, столбец 2) и (строка 3, столбец 4).

Возможно ли это сделать? Любые подсказки, которые могли бы заставить меня начать, будут оценены.


person bircastri    schedule 24.05.2012    source источник
comment
да возможно, ничего особенного, отредактируйте свой вопрос с помощью SSCCE, демонстрирующего вашу проблему (проблемы), но после прочтения учебник по JTable   -  person mKorbel    schedule 24.05.2012
comment
Я бы использовал слушателя. Я думаю, что ActionListener справится с задачей   -  person Igor Brusamolin Lobo Santos    schedule 24.05.2012
comment
Как actionListener заставит его мигать, вам нужно будет использовать что-то вроде таймера, чтобы это сделать   -  person mprabhat    schedule 24.05.2012
comment
Хотя мигание ячеек возможно, рассмотрите другие аспекты, такие как изменение цвета фона. Это может быть более удобным для пользователя. Если вы идете с миганием, просто создайте таймер и на каждом тике мигайте соответствующие ячейки.   -  person Daniel H.    schedule 24.05.2012
comment
Random для создания Color и Swing Timer и XxxRenderer, или можно изменить (лучше и проще) Swing Timer с помощью Runnable#Thread, связанного с Thread.sleep(int)   -  person mKorbel    schedule 24.05.2012
comment
Хорошо, но я не знаю, как это понять.... Можем ли мы прислать мне немного сомпле?   -  person bircastri    schedule 25.05.2012


Ответы (1)


Я нахожу одну статью для вашего ответа:

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;
        }
    }
}
person chenyi1976    schedule 08.06.2012
comment
этот пример - причина, по которой Swing Timer существует, кстати +1 - person mKorbel; 08.06.2012
comment
@mKorbel спасибо за голосование и один небольшой вопрос: нужно ли помещать table.tableChanged() в SwingUtilities.invokeLater()? Благодарность - person chenyi1976; 08.06.2012
comment
в основном Swing ничего не знает о Thread, тогда все выходные данные (из Thread) в методы non_Thread_Safe (например, setText, appent) находятся вне EDT, ответ - да, требуется и является самым безопасным, Swing Timer - лучший способ для этого, а не используйте Thread и с Thread.Sleep(int) - person mKorbel; 08.06.2012
comment
Я думаю, что если вы используете таймер Swing, он выполнит для вас работу по обработке таймера в потоке событий. - person sjr; 12.06.2012