JTable实现排序大放送!!

neek2000 2002-05-09 11:24:10
前两天在这里问的,没有人回答,自己搞出来了,贡献一下,求人不如求己。

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.text.*;
import javax.swing.*;
import javax.swing.table.*;

public class SortableTableExample extends JPanel {
public SortableTableExample(){
setLayout(new BorderLayout());

Vector columnNames = new Vector();
columnNames.add("Name");
columnNames.add("Date");
columnNames.add("Size");
columnNames.add("Dir");

SortableTableModel dm = new SortableTableModel(columnNames, 0) {
public Class getColumnClass(int col) {
return Object.class;
}

public boolean isCellEditable(int row, int col) {
switch (col) {
case 1: return false;
default: return true;
}
}

public void setValueAt(Object obj, int row, int col) {
switch (col) {
case 2: super.setValueAt(new Integer(obj.toString()), row, col);
return;
default: super.setValueAt(obj, row, col);
return;
}
}
};

......

JTable table = new JTable(dm);
Object[] rows = {a, 2002/5/5, 1000, Hello};
dm.addRow(rows);
Object[] rows1 = {b, 2002/4/5, 1001, Test};
dm.addRow(rows1);
Object[] rows2 = {c, 2002/3/5, 1002, JTable};
dm.addRow(rows2);
Object[] rows3 = {d, 2002/2/5, 1003, God};
dm.addRow(rows3);
Object[] rows4 = {e, 2002/1/5, 1004, OK};
dm.addRow(rows4);
table.setShowVerticalLines(true);
table.setShowHorizontalLines(false);
SortButtonRenderer renderer = new SortButtonRenderer();
TableColumnModel model = table.getColumnModel();

for (int i=0;i<4;i++) {
model.getColumn(i).setHeaderRenderer(renderer);
}

JTableHeader header = table.getTableHeader();
header.addMouseListener(new HeaderListener(header,renderer));
JScrollPane pane = new JScrollPane(table);
add(pane, BorderLayout.CENTER);

}

public static void main(String[] args) {
JFrame f= new JFrame("SortableTable Example");
f.getContentPane().add(new SortableTableExample(), BorderLayout.CENTER);
f.setSize(400, 160);
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
});
}

private static DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.JAPAN);
private static Date getDate(String dateString) {
Date date = null;
try {
date = dateFormat.parse(dateString);
} catch(ParseException ex) {
date = new Date();
}
return date;
}

class HeaderListener extends MouseAdapter {
JTableHeader header;
SortButtonRenderer renderer;
HeaderListener(JTableHeader header,SortButtonRenderer renderer) {
this.header = header;
this.renderer = renderer;
}
public void mousePressed(MouseEvent e) {
int col = header.columnAtPoint(e.getPoint());
int sortCol = header.getTable().convertColumnIndexToModel(col);
renderer.setPressedColumn(col);
renderer.setSelectedColumn(col);
header.repaint();
if (header.getTable().isEditing()) {
header.getTable().getCellEditor().stopCellEditing();
}
boolean isAscent;
if (SortButtonRenderer.DOWN == renderer.getState(col)) {
isAscent = true;
}else{
isAscent = false;
}
((SortableTableModel)header.getTable().getModel()).sortByColumn(sortCol, isAscent);
}
public void mouseReleased(MouseEvent e) {
int col = header.columnAtPoint(e.getPoint());
renderer.setPressedColumn(-1);
// clear
header.repaint();
}
}
}

class SortableTableModel extends DefaultTableModel {

TableSorter sorter;

public SortableTableModel(Vector columnNames, int rowCount){
super(columnNames,rowCount);
}

public void sortByColumn(int column, boolean isAscent) {
if (sorter == null) {
sorter = new TableSorter(this);
}
sorter.sort(column, isAscent);
fireTableDataChanged();
}
}

class TableSorter {
SortableTableModel model;
public TableSorter(SortableTableModel model) {
this.model = model;
}
//n2 selection
public void sort(int column, boolean isAscent) {
int n = model.getRowCount();
Vector indexes = model.getDataVector();
for (int i=0; i<n-1; i++) {
int k = i;
for (int j=i+1; j<n; j++) {
if (isAscent) {
if (compare(column, j, k) < 0) {
k = j;
}
} else {
if (compare(column, j, k) > 0) {
k = j;
}
}
}
Vector tmp = (Vector)indexes.elementAt(i);
indexes.setElementAt(indexes.elementAt(k), i);
indexes.setElementAt(tmp, k);
}
}
// comparaters

public int compare(int column, int row1, int row2) {
Object o1 = model.getValueAt(row1, column);
Object o2 = model.getValueAt(row2, column);
if (o1 == null && o2 == null) {
return 0;
} else if (o1 == null) {
return -1;
} else if (o2 == null) {
return 1;
} else {
Class type = model.getColumnClass(column);
if (type.getSuperclass() == Number.class) {
return compare((Number)o1, (Number)o2);
} else if (type == String.class) {
return ((String)o1).compareTo((String)o2);
} else if (type == Date.class) {
return compare((Date)o1, (Date)o2);
} else if (type == Boolean.class) {
return compare((Boolean)o1, (Boolean)o2);
} else {
return ((String)o1).compareTo((String)o2);
}
}
}

public int compare(Number o1, Number o2) {
double n1 = o1.doubleValue();
double n2 = o2.doubleValue();
if (n1 < n2) {
return -1;
} else if (n1 > n2) {
return 1;
} else {
return 0;
}
}

public int compare(Date o1, Date o2) {
long n1 = o1.getTime();
long n2 = o2.getTime();
if (n1 < n2) {
return -1;
} else if (n1 > n2) {
return 1;
} else {
return 0;
}
}

public int compare(Boolean o1, Boolean o2) {
boolean b1 = o1.booleanValue();
boolean b2 = o2.booleanValue();
if (b1 == b2) {
return 0;
} else if (b1) {
return 1;
} else {
return -1;
}
}
}
...全文
268 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
waterdragonfly 2002-05-09
  • 打赏
  • 举报
回复
《核心卷II》上不是有怎么实现的吗?
上次没人回答吗?
肖尧19 2002-05-09
  • 打赏
  • 举报
回复
瞧瞧罗。。。
长乐子 2002-05-09
  • 打赏
  • 举报
回复
请问你的问题是什么?
neek2000 2002-05-09
  • 打赏
  • 举报
回复
class SortButtonRenderer extends JButton implements TableCellRenderer {

public static final int NONE = 0;
public static final int DOWN = 1;
public static final int UP = 2;

int pushedColumn;
Hashtable state;
JButton downButton,upButton;

public SortButtonRenderer() {
setFont(new java.awt.Font("Dialog", 0, 13));
pushedColumn = -1;
state = new Hashtable();

setMargin(new Insets(0,0,0,0));
setHorizontalTextPosition(LEFT);

downButton = new JButton();
downButton.setFont(new java.awt.Font("Dialog", 0, 13));
downButton.setMargin(new Insets(0,0,0,0));
downButton.setHorizontalTextPosition(LEFT);

upButton = new JButton();
upButton.setFont(new java.awt.Font("Dialog", 0, 13));
upButton.setMargin(new Insets(0,0,0,0));
upButton.setHorizontalTextPosition(LEFT);
}

public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
JButton button = this;
Object obj = state.get(new Integer(column));
if (obj != null) {
if (((Integer)obj).intValue() == DOWN) {
button = downButton;
}else{
button = upButton;
}
}
button.setText((value ==null) ? "" : value.toString());
boolean isPressed = (column == pushedColumn);
button.getModel().setPressed(isPressed);
button.getModel().setArmed(isPressed);
return button;
}

public void setPressedColumn(int col) {
pushedColumn = col;
}

public void setSelectedColumn(int col) {
if (col < 0) return;
Integer value = null;
Object obj = state.get(new Integer(col));
if (obj == null) {
value = new Integer(DOWN);
} else {
if (((Integer)obj).intValue() == DOWN) {
value = new Integer(UP);
} else {
value = new Integer(DOWN);
}
}
state.clear();
state.put(new Integer(col), value);
}

public int getState(int col) {
int retValue;
Object obj = state.get(new Integer(col));
if (obj == null) {
retValue = NONE;
} else {
if (((Integer)obj).intValue() == DOWN) {
retValue = DOWN;
} else {
retValue = UP;
}
}
return retValue;
}
}
内容概要:本文提出了一种基于改进扩散模型的高海拔地区新能源高波动出力场景生成方法,并提供了完整的Python代码实现。该方法针对高海拔地区风能、光伏等新能源出力波动剧烈、不确定性高的特点,通过优化扩散模型的结构与训练策略,有效捕捉历史数据的概率分布特征与时序相关性,从而生成高质量、多样化的出力场景。文中详细阐述了模型的数学推导、网络架构设计、损失函数优化及采样算法改进,并通过实验证明其在拟合精度、场景多样性与稳定性方面优于传统生成模型,为电力系统在高比例新能源接入下的规划、调度与风险评估提供了可靠的场景输入支持。; 适合人群:具备一定Python编程能力和机器学习基础,从事新能源发电预测、电力系统分析、智能优化、场景生成等方向研究的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①用于高海拔地区风电、光伏出力的不确定性建模与多场景生成;②支撑含高渗透率新能源的电力系统随机优化调度、鲁棒决策与风险评估;③为相关学术研究、论文复现与算法改进提供可运行的技术方案与代码基础; 阅读建议:建议读者结合所提供的完整资源(代码、数据集、说明文档)进行实践操作,重点关注扩散模型的前向加噪与反向去噪过程的设计细节,以及如何将其适配于新能源时序数据的生成任务,通过参数调优与对比实验深入理解模型的生成机制与性能边界。
内容概要:本文围绕基于静态约束法的配电网电动汽车接入容量评估展开研究,提出了一种在新型电力系统背景下评估主动配电网对电动汽车承载能力的方法。研究通过构建数学模型,结合潮流计算与关键约束条件(如电压越限、线路过载等),量化分析配电网可承受的最大电动汽车充电负荷容量,旨在识别规模化电动汽车接入带来的潜在运行风险,并为电网规划与运行提供科学依据。文中配套提供了完整的Matlab代码实现,便于仿真验证与结果复现。此外,该研究与分布式光伏承载力评估、电动汽车可调能力分析等方向形成技术联动,展现了多主题协同的研究体系。; 适合人群:具备电力系统分析基础理论知识及Matlab编程能力的高校研究生、科研机构研究人员,以及从事新能源并网、智能配电网规划与运行等相关领域的工程技术人员。; 使用场景及目标:①用于学术研究中的模型复现与论文撰写支撑;②评估实际配电网中电动汽车大规模接入的可行性与安全边界,指导充电基础设施布局;③作为高校教学案例,帮助学生深入理解电网承载力评估的核心原理、建模方法与仿真技术; 阅读建议:建议结合文中提及的相关研究方向(如二阶锥规划、多面体聚合方法等)进行对比学习,充分利用所提供的Matlab代码与网盘资料开展仿真实验,重点关注约束条件的设定逻辑与潮流计算模块的实现细节,以深化对评估模型机理与工程应用价值的理解。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧