3

Java で Swing ライブラリを使用してアプリケーションを作成しています。を拡張する表コンポーネントがあり、表のセルに色を付けるためJTable、このコンポーネントでメソッドをオーバーライドしました。getTableCellRendererComponentカスタム テーブル モデル (デフォルト テーブル モデルから拡張) があり、JPanel に追加したテーブル コンポーネント自体があります。これはすべて機能します。

ここで、セルを点滅させる機能をこの表に追加したいと思います。一度に複数のセル、つまり (行 1、列 2) と (行 3、列 4) のセルが点滅する可能性があります。

これは可能ですか?私を始めるためのヒントをいただければ幸いです。

4

1 に答える 1

3

あなたの答えに 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;
        }
    }
}
于 2012-06-08T07:13:01.817 に答える