您的位置:首页 > 其它

一个可以实现 左右联动JTable 的完全Dialog 实现类似 Excel的冻结第一列 效果

2010-10-18 17:49 639 查看
package spasvo.tcder.gui.dialog.impl;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;

import spasvo.tcder.uitl.DialogUtil;

public class CombineConfigDialog extends JDialog {

private static final long serialVersionUID = 1L;
private JTable leftColumsTable;
private JTable rightColumnsTable;

private static CombineConfigDialog instance = null;
/** 关系Integer [源:唯一 column,目标:不唯一 row ] a(目标)=b(源) */
private List<Integer[]> relation = new ArrayList<Integer[]>();
/** 需要显示的内容 Object[]{content,TCDImageItem.timeId,userDataBean.timeId} */
private List<Object[]> content = null;

public static synchronized CombineConfigDialog getInstance() {
if (instance == null) {
instance = new CombineConfigDialog();
}
return instance;
}

/**
* 设置需要显示的内容 Object[]{content,TCDImageItem.timeId,userDataBean.timeId}
*
* @param data
* @param rela
* 关系
*/
public void updateContent(List<Object[]> data, List<Integer[]> rela) {
this.content = data;
this.relation = rela;
LeftColumnsTableModel leftModel = (LeftColumnsTableModel) leftColumsTable
.getModel();
leftModel.updataContent(content);
RightColumnsTableModel rightModel = (RightColumnsTableModel) rightColumnsTable
.getModel();
rightModel.updataContent(content);
FontMetrics fm = rightColumnsTable.getFontMetrics(rightColumnsTable
.getFont());
for (int i = 0; i < content.size(); i++) {
int width = fm.stringWidth(content.get(i)[0].toString()) + 10;
rightColumnsTable.getColumnModel().getColumn(i).setMaxWidth(width);
rightColumnsTable.getColumnModel().getColumn(i).setPreferredWidth(
width);
}
}

private CombineConfigDialog() {
setSize(new Dimension(1000, 700));
setModal(true);
setLocationRelativeTo(null);
JSplitPane splitPane = new JSplitPane();
getContentPane().add(splitPane, BorderLayout.CENTER);
splitPane.setDividerLocation(100);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
int i = DialogUtil.confirmDialog("是否完成<合并设置>?");
if (i == DialogUtil.SELECT_YES) {
setVisible(false);
}
}
});

final JScrollPane scrollPane = new JScrollPane();
scrollPane.setMinimumSize(new Dimension(100, 0));
scrollPane
.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
splitPane.setLeftComponent(scrollPane);
splitPane.setDividerSize(2);

leftColumsTable = new JTable();
leftColumsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
leftColumsTable.setModel(new LeftColumnsTableModel());
leftColumsTable.getColumnModel().getColumn(0).setMinWidth(100);
// leftColumsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
/*
* 左边Table 联动
*/
leftColumsTable.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
int index[] = leftColumsTable.getSelectedRows();
if (index.length <= 0) {
return;
}
rightColumnsTable.setRowSelectionInterval(index[0],
index[index.length - 1]);
}
});
scrollPane.setViewportView(leftColumsTable);

JScrollPane scrollPane_1 = new JScrollPane();
splitPane.setRightComponent(scrollPane_1);

rightColumnsTable = new JTable() {
private static final long serialVersionUID = -5238500618331915171L;

@Override
public String getToolTipText(MouseEvent e) {
java.awt.Point p = e.getPoint();
int rowIndex = rowAtPoint(p);
int colIndex = convertColumnIndexToModel(columnAtPoint(p));
if (rowIndex >= colIndex) {
return "无效";
}
// 确保是真的列数
Object[] leftObj = content.get(rowIndex);
Object[] rightObj = content.get(colIndex);
return leftObj[0] + " = " + rightObj[0];
}
};
rightColumnsTable.setModel(new RightColumnsTableModel());
rightColumnsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
rightColumnsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
/*
* 有边Table 联动
*/
rightColumnsTable.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
int index[] = rightColumnsTable.getSelectedRows();
if (index.length <= 0) {
return;
}
leftColumsTable.setRowSelectionInterval(index[0],
index[index.length - 1]);
}
});
/*
* 单击修改单元格
*/
rightColumnsTable.addMouseListener(new MouseAdapter() {

@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
// 改变单元格的内容
int column = rightColumnsTable.getSelectedColumn();
int row = rightColumnsTable.getSelectedRow();
RightColumnsTableModel mode = (RightColumnsTableModel) rightColumnsTable
.getModel();
mode.updateCellValue(row, column);
}
}
});

scrollPane_1.setViewportView(rightColumnsTable);

JScrollBar hbar_1 = scrollPane_1.getVerticalScrollBar();
hbar_1.addAdjustmentListener(new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
scrollPane.getVerticalScrollBar().setValue(e.getValue());
}
});
rightColumnsTable.setDefaultRenderer(Object.class,
new RightTableCellRenerer());
}

public static void main(String[] args) {
List<Object[]> data = new ArrayList<Object[]>();
String itemName = "";
for (int i = 0; i < 20; i++) {
if (i % 10 == 0) {
itemName = "组件" + i;
}
Object[] objs = { "栏位xxxxxxxxxxxx" + i, itemName, i };
data.add(objs);
}
CombineConfigDialog xx = CombineConfigDialog.getInstance();
xx.updateContent(data, new ArrayList<Integer[]>());
xx.setVisible(true);
}

class LeftColumnsTableModel extends AbstractTableModel {

private static final long serialVersionUID = 1L;

private String[] columns = new String[] { "组件名" };

private List<Object[]> content = new ArrayList<Object[]>();

public void updataContent(List<Object[]> content) {
this.content = content;
fireTableDataChanged();
}

@Override
public String getColumnName(int c) {
return columns[c];
}

@Override
public int getColumnCount() {
return columns.length;
}

@Override
public int getRowCount() {
return content.size();
}

@Override
public Object getValueAt(int r, int c) {
return content.get(r)[0];
}

}

class RightColumnsTableModel extends AbstractTableModel {

private static final long serialVersionUID = 1L;

private List<Object[]> content = new ArrayList<Object[]>();

public RightColumnsTableModel() {
}

/**
* 更新显示
*
* @param content
*/
public void updataContent(List<Object[]> content) {
this.content = content;
fireTableStructureChanged();
}

@Override
public String getColumnName(int c) {
return content.get(c)[0].toString();
}

@Override
public int getColumnCount() {
return content.size();
}

@Override
public int getRowCount() {
return content.size();
}

@Override
public Object getValueAt(int r, int c) {
if (isRelation(r, c)) {
return "√";
}
return "";
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}

/**
* 返回此单元格是否定义
*
* @param r
* @param c
* @return
*/
private boolean isRelation(int r, int c) {
for (Integer[] obj : relation) {
if (obj[0] == r && obj[1] == c) {
return true;
}
}
return false;
}

/**
* 改变单元格的值
*
* @param r
* @param c
*/
public void updateCellValue(int r, int c) {
if (r <= c) {
// 无效
return;
}
Integer[] rc = null;
for (Integer[] rel : relation) {
if (rel[0] == r) {
rc = rel;
break;
}
}
if (rc != null) {
if (rc[1] == c) {
// 取消选中
relation.remove(rc);
} else {
// 本列已经选中
DialogUtil.promptError("该行已定义!");
}
} else {
// 本列还未选中 注意 c 是唯一的
relation.add(new Integer[] { r, c });
}

fireTableCellUpdated(r, c);
}
}

/**
* 右边Table着色
*
* @author
*
*/
class RightTableCellRenerer extends DefaultTableCellRenderer {

private static final long serialVersionUID = 1L;

private boolean isWrite = false;

@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
Component comp = super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
setHorizontalAlignment(JLabel.CENTER);
// 着色会不能显示选中状态
isWrite = (row <= column);
return comp;
}

@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
if (isWrite) {
// 画线
g2d.setPaint(Color.black);
g2d.setStroke(new BasicStroke(.33f));
g2d.drawLine(0, 0, (int) getSize().getWidth(), (int) getSize()
.getHeight() - 1);
// 着色
g2d.setPaint(Color.gray);
g2d.fillRect(0, 0, (int) getSize().getWidth(), (int) getSize()
.getHeight());
}
}
}

public List<Integer[]> getRelation() {
return relation;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐