当前位置: 技术问答>java相关
关于JTable的单元格闪动的问题。
来源: 互联网 发布时间:2015-05-10
本文导语: 在我写的程序里,要求server定时发数据到client并显示到JTable里。 因为server端变化的数据不是很多,所以每次传的数据只是变化了的数据。 现在已经做到可以把变化的数据传到client并显示出来。 但还要求,在JTable里...
在我写的程序里,要求server定时发数据到client并显示到JTable里。
因为server端变化的数据不是很多,所以每次传的数据只是变化了的数据。
现在已经做到可以把变化的数据传到client并显示出来。
但还要求,在JTable里变化了的数据,闪动一下。以提醒客户,哪个数值变化了。
不知道这个功能该怎么实现?
我一点思路都没有。
因为server端变化的数据不是很多,所以每次传的数据只是变化了的数据。
现在已经做到可以把变化的数据传到client并显示出来。
但还要求,在JTable里变化了的数据,闪动一下。以提醒客户,哪个数值变化了。
不知道这个功能该怎么实现?
我一点思路都没有。
|
看符不符合你的要求, 剩下的自己应该可以搞定吧. :)
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.table.*;
public class Test extends JFrame
{
public Test(String s)
{
super(s);
init();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(new Dimension(400, 300));
setVisible(true);
}
MyRenderer myRenderer;
JTable table;
JScrollPane scroller;
javax.swing.Timer timer;
String[] header = {"C1", "C2", "C3"};
String[][] data =
{
{"0, 0", "1, 0", "2, 0"},
{"0, 1", "1, 1", "2, 1"}
};
private void init()
{
MyModel model = new MyModel(data, header);
table = new JTable(model);
myRenderer = new MyRenderer();
table.setDefaultRenderer(String.class, myRenderer);
scroller = new JScrollPane(table);
getContentPane().add(scroller);
timer = new javax.swing.Timer(500, getAction());
timer.start();
}
private Action getAction()
{
return new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
myRenderer.toggleFlashed();
System.err.println("toggle");
table.repaint();
}
};
}
class MyModel extends DefaultTableModel
{
public MyModel(String[][] data, String[] header)
{
super(data, header);
}
public Class getColumnClass(int columnIndex)
{
return String.class;
}
}
class MyRenderer extends DefaultTableCellRenderer
{
private JLabel label = new JLabel();
private boolean flashed;
public MyRenderer()
{
label = new JLabel();
label.setOpaque(true);
label.setBackground(Color.blue);
flashed = false;
}
public boolean isFlashed()
{
return flashed;
}
public void toggleFlashed()
{
flashed = !flashed;
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column)
{
if (flashed && row == 1 && column == 1)
{
label.setText(value.toString());
System.err.println("OKOK");
return label;
}
else
{
return super.getTableCellRendererComponent(table, value,
isSelected, hasFocus,
row, column);
}
}
}
public static void main(String[] args)
{
try
{
Test t = new Test("Test");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.table.*;
public class Test extends JFrame
{
public Test(String s)
{
super(s);
init();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(new Dimension(400, 300));
setVisible(true);
}
MyRenderer myRenderer;
JTable table;
JScrollPane scroller;
javax.swing.Timer timer;
String[] header = {"C1", "C2", "C3"};
String[][] data =
{
{"0, 0", "1, 0", "2, 0"},
{"0, 1", "1, 1", "2, 1"}
};
private void init()
{
MyModel model = new MyModel(data, header);
table = new JTable(model);
myRenderer = new MyRenderer();
table.setDefaultRenderer(String.class, myRenderer);
scroller = new JScrollPane(table);
getContentPane().add(scroller);
timer = new javax.swing.Timer(500, getAction());
timer.start();
}
private Action getAction()
{
return new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
myRenderer.toggleFlashed();
System.err.println("toggle");
table.repaint();
}
};
}
class MyModel extends DefaultTableModel
{
public MyModel(String[][] data, String[] header)
{
super(data, header);
}
public Class getColumnClass(int columnIndex)
{
return String.class;
}
}
class MyRenderer extends DefaultTableCellRenderer
{
private JLabel label = new JLabel();
private boolean flashed;
public MyRenderer()
{
label = new JLabel();
label.setOpaque(true);
label.setBackground(Color.blue);
flashed = false;
}
public boolean isFlashed()
{
return flashed;
}
public void toggleFlashed()
{
flashed = !flashed;
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column)
{
if (flashed && row == 1 && column == 1)
{
label.setText(value.toString());
System.err.println("OKOK");
return label;
}
else
{
return super.getTableCellRendererComponent(table, value,
isSelected, hasFocus,
row, column);
}
}
}
public static void main(String[] args)
{
try
{
Test t = new Test("Test");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
|
只是一个想法, 没有试过.
得自己写一个 TableCellRender, 当数据改动时, 给数据加一个
标志位, 然后根据数据的标志位来 flash , 可能需要线程或者 timer
得自己写一个 TableCellRender, 当数据改动时, 给数据加一个
标志位, 然后根据数据的标志位来 flash , 可能需要线程或者 timer