首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

jTable行的颜色,移动以及列值不变的有关问题

2012-05-16 
jTable行的颜色,移动以及列值不变的问题先说行移动问题,我希望在jTable中能够将选中行进行上下移动,想的方

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) {


Boolean b = (Boolean) value;

if (b && iCount == data.size() - 1) {
return;
}
if (!b && iCount == 0) {
return;
}

iCount += b ? 1 : -1;
JOptionPane.showMessageDialog(table, "选中个数:" + iCount);
super.setValueAt(value, row, column);

} else {

super.setValueAt(value, row, column);
}
}

@Override
public Class <?> getColumnClass(int columnIndex) {
return data.get(0).get(columnIndex).getClass();
}
});

refreshTable();

c.setLayout(new BorderLayout());
c.add(new JScrollPane(table));
c.add(createButtonPanel(), BorderLayout.SOUTH);
setSize(600, 400);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}

//

private JPanel createButtonPanel() {
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());

JButton upButton = new JButton("向上");
JButton downButton = new JButton("向下");

upButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int r = table.getSelectedRow();
if (r <= 0) {
return;
}

swapData(r, true);

//
Object value = data.get(r).get(0);
Object value2 = data.get(r - 1).get(0);
updateMapInfo(value, value2);
((DefaultTableModel) table.getModel()).fireTableRowsUpdated(
r - 1, r);
table.changeSelection(r - 1, 0, false, false);

}
});

downButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int r = table.getSelectedRow();
if (r < 0 || r >= data.size()) {
return;
}
swapData(r, false);

//
Object value = data.get(r).get(0);
Object value2 = data.get(r + 1).get(0);
updateMapInfo(value, value2);
((DefaultTableModel) table.getModel()).fireTableRowsUpdated(
r - 1, r);
table.changeSelection(r + 1, 0, false, false);
}

});

panel.add(upButton);
panel.add(downButton);

return panel;
}

private void swapData(int r, boolean isUp) {
Vector <Object> obj = data.get(r);

int newIndex = isUp ? r - 1 : r + 1;
data.set(r, data.get(newIndex));
data.set(newIndex, obj);
}

private void updateMapInfo(Object value, Object oldValue) {
Integer row1 = idToRowMap.get(value);
Integer row2 = idToRowMap.get(String.valueOf(oldValue));
idToRowMap.put(value.toString(), row2);
idToRowMap.put(String.valueOf(oldValue), row1);
}

private void refreshTable() {
TableColumnModel columnModel = table.getColumnModel();
for (int i = 0; i < columnModel.getColumnCount() - 1; i++) {
columnModel.getColumn(i).setCellRenderer(render);
}
}

private void initData() {
for (int i = 0; i < 4; i++) {
COLUMN_NAMES.add("column" + (i + 1));
}
for (int i = 0; i < 20; i++) {
Vector <Object> record = new Vector <Object>();
String id = String.valueOf(i + 1);
record.add(id);
record.add("aa");
record.add("bb");
record.add(new Boolean(false));
data.add(record);
idToRowMap.put(id, new Integer(i));
}
}

public static void main(String args[]) {


new ExchangeDemo();
}
}

热点排行