开始关注下UI了

这几天公司安排做UI了,这对于我这个只做过后台的家伙确实是个不错的学习机会.
现在对于UI已经有了一点小感觉了,希望能够继续深入下去.
顺便贴下一个jtable的排序实现(来自http://blog.sina.com.cn/s/blog_4c175081010008ct.html):

代码如下:一共两个类SortManager、UpDownArrow。用法很简单,只要把你的JTable对象放到SortManager 对象的参数里就可以了,剩下的仔细看看就会明白的!
SortManager sortManager = new SortManager(JTable对象);

package zww;

import java.awt.*;
import java.awt.event.*;
import java.util.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;


public class SortManager implements TableModelListener {

final static Icon upIcon = new UpDownArrow(0);
final static Icon downIcon = new UpDownArrow(1);

private JTable table;

private TableModel dataModel;
private int sortColumn;

private Row rows[];

private boolean ascending;
private int sortableColumns[];

public SortManager(JTable jtable) {
rows = null;
ascending = true;
sortableColumns = null;
table = jtable;
int i=0;
int length=jtable.getModel().getColumnCount();
final int[] columns=new int[length];
for(;i<length;i++){
columns[i]=i;
}
sortableColumns=columns;
initialize();
}

public SortManager(JTable jtable, int i) {
rows = null;
ascending = true;
sortableColumns = null;
table = jtable;
sortColumn = i;
initialize();
}

public SortManager(JTable jtable, int ai[]) {
this(jtable, ai[0]);
sortableColumns = (int[]) ai.clone();
}

public void initialize() {
dataModel = table.getModel();
((AbstractTableModel) dataModel).addTableModelListener(this);
addMouseListener(table);
JTableHeader jtableheader = table.getTableHeader();
jtableheader.setDefaultRenderer(createHeaderRenderer());
if (table.getRowCount() > 0) {
reinitialize();
}
}

protected TableCellRenderer createHeaderRenderer() {
DefaultTableCellRenderer defaultHeaderRenderer = new SortHeaderRenderer();
defaultHeaderRenderer.setHorizontalAlignment(0);
defaultHeaderRenderer.setHorizontalTextPosition(2);
return defaultHeaderRenderer;
}

public void reinitialize() {
rows = null;
if (table.getRowCount() > 0) {
rows = new Row[table.getRowCount()];
for (int i = 0; i < rows.length; i++) {
rows[i] = new Row();
rows[i].index = i;
}

if (columnIsSortable(sortColumn)) {
sort();
}
}
}

private boolean columnIsSortable(int i) {
if (rows != null) {
if (sortableColumns != null) {
for (int j = 0; j < sortableColumns.length; j++) {
if (i == sortableColumns[j]) {
return true;
}
}

} else {
return true;
}
}
return false;
}

public void addMouseListener(final JTable table) {
table.getTableHeader().addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent mouseevent) {
int i = table.columnAtPoint(mouseevent.getPoint());
int j = table.convertColumnIndexToModel(i);
//转换出用户想排序的列和底层数据的列,然后判断
if (!columnIsSortable(j)) {
return;
}
if (j == sortColumn) {
ascending = !ascending;
} else {
ascending = true;
sortColumn = j;
}
sort();
}

});
}

public void sort() {
if (rows == null) {
return;
} else {

((AbstractTableModel) dataModel).removeTableModelListener(this);
Arrays.sort(rows);
resetData();
((AbstractTableModel) dataModel).fireTableDataChanged();
((AbstractTableModel) dataModel).addTableModelListener(this);
table.revalidate();
table.repaint();
return;
}
}

public void resetData() {
Vector data=new Vector(dataModel.getRowCount());
int i=0;
for(;i<dataModel.getRowCount();i++){
int j=0;
final Vector vv=new Vector(dataModel.getColumnCount());
for(;j<dataModel.getColumnCount();j++){
vv.add(dataModel.getValueAt(i,j));
}
data.add(vv);
}
i=0;
for(;i<rows.length;i++){
if(rows[i].index!=i){
int j=0;
final Vector vv=(Vector)data.get(rows[i].index);
for(;j<dataModel.getColumnCount();j++){
dataModel.setValueAt(vv.get(j),i,j);
}
}
}
}

public void tableChanged(TableModelEvent tablemodelevent) {
reinitialize();
}


private class SortHeaderRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable jtable,
Object obj, boolean flag, boolean flag1, int i, int j) {
if (jtable != null) {
JTableHeader jtableheader = jtable.getTableHeader();
if (jtableheader != null) {
setForeground(jtableheader.getForeground());
setBackground(jtableheader.getBackground());
setFont(jtableheader.getFont());
}
}
setText(obj != null ? obj.toString() : "");
int k = jtable.convertColumnIndexToModel(j);
if (k == sortColumn) {
setIcon(ascending ? SortManager.upIcon : SortManager.downIcon);
} else {
setIcon(null);
}
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
return this;
}
}


private class Row implements Comparable {
private Row() {
}

public int compareTo(Object obj) {
Row row = (Row) obj;

java.text.Collator cnCollator = java.text.Collator.getInstance(Locale.getDefault());
Object obj1 = dataModel.getValueAt(index, sortColumn);
Object obj2 = dataModel.getValueAt(row.index, sortColumn);
if (ascending) {
if (!(obj1 instanceof Comparable)) {
return -1;
}
if (!(obj2 instanceof Comparable)) {
return 1;
} else {
return cnCollator.compare(obj1,obj2);
}
}
if (!(obj1 instanceof Comparable)) {
return 1;
}
if (!(obj2 instanceof Comparable)) {
return -1;
} else {
return cnCollator.compare(obj2,obj1);
}

}

public int index;
}

}

package zww;

import java.awt.*;

import javax.swing.*;

public class UpDownArrow implements Icon {
private int size = 12;

public static final int UP = 0;
public static final int DOWN = 1;
private int direction;

public UpDownArrow(int i) {
direction = i;
}

public int getIconHeight() {
return size;
}

public int getIconWidth() {
return size;
}

public void paintIcon(Component component, Graphics g, int i, int j) {
int k = i + size / 2;
int l = i + 1;
int i1 = (i + size) - 2;
int j1 = j + 1;
int k1 = (j + size) - 2;
Color color = (Color) UIManager.get("controlDkShadow");
if (direction == 0) {
g.setColor(Color.white);
g.drawLine(l, k1, i1, k1);
g.drawLine(i1, k1, k, j1);
g.setColor(color);
g.drawLine(l, k1, k, j1);
} else {
g.setColor(color);
g.drawLine(l, j1, i1, j1);
g.drawLine(l, j1, k, k1);
g.setColor(Color.white);
g.drawLine(i1, j1, k, k1);
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值