日期:2014-05-20  浏览次数:20713 次

jTable行的颜色,移动以及列值不变的问题
先说行移动问题,我希望在jTable中能够将选中行进行上下移动,想的方法是加2个jButton,一个是向上移动,一个是向下移动,然后响应事件中通过获取选中行的index,进行moveRow,并将上(或下)一行同时向下(或上)移,这个应该能实现。

再说行的颜色,我现在的jTable是取另外2个jTable的值而得到的数据,其中1个jTable固定取90行,另一个则取任意行,我现在想在新的jTable中将第一个取到的90行的行颜色设为绿色,将第二个取到的任意行的行颜色设为蓝色,这个可以在DefaultTableCellRenderer里面改,但是问题是如果我进行上下行的移动后,如何保证行的颜色也同时改变?举个例子,我现在的第90行是绿色,第91行是蓝色,如何保证第90行向下移后(同时第91行会向上移),新的第90行变成了蓝色,第91行变成绿色,就是想行移动时颜色随着移动。

最后列值,新jTable中第一列是id,固定了前90行是数字1-90,后面全部为空,如何保证我在行移动时id值保持不变,不管怎么移动,id值永远是前面90行1-90,后面的为空。

因为还没写程序,这些都是暂时的想法,所以希望大家能耐心看完帮帮偶~

------解决方案--------------------
Java code
 

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;

public class ExchangeDemo extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private Vector <Vector <Object>> data = new Vector <Vector <Object>>();
private static final Vector <String> COLUMN_NAMES = new Vector <String>();
private JTable table;
private int iCount = 0;
// 用来存储id和行的对应关系,看着方便一点
private HashMap <String, Integer> idToRowMap = new HashMap <String, Integer>();

DefaultTableCellRenderer render = new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {

Component c = super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
if (row < 10) {
setBackground(row % 2 == 0 ? Color.green : Color.blue);
} else {
setBackground(Color.red);
}
return c;
}
};

public ExchangeDemo() {
super();
initData();
Container c = getContentPane();
table = new JTable();
table.setModel(new DefaultTableModel(data, COLUMN_NAMES) {

/**
*
*/
private static final long serialVersionUID = 1L;

@Override
public void setValueAt(Object value, int row, int column) {
Object oValue = getValueAt(row, column);
if (value.equals(oValue)) {
return;
}

if (column == 0) {
int iValue;
try {
iValue = Integer.parseInt(value.toString());
} catch (Exception e) {
// TODO: 这地方的判断小子自己做吧
e.printStackTrace();
return;
}

if (iValue - 1 >= data.size()) {
// 这地方通常好的软件有一些比较强的处理,我就先拿这个顶了
JOptionPane.showMessageDialog(table, "error");
return;
}
if (row < data.size() && column < COLUMN_NAMES.size()) {

Object oldValue = data.get(row).get(column);

data.get(row).set(column,
value == null ? "" : value.toString());
data.get(idToRowMap.get(String.valueOf(value))).set(
column, oldValue);
//
updateMapInfo(value, oldValue);
fireTableDataChanged();
}
} else if (column == 3) {