这几天公司安排做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);
}
}
}
分享到:
相关推荐
1、语义化 Amaze UI开发遵循语义化原则,意图通过类名(class)等信息直观传达元素的功能角色,同时关注结构、样式、行为分离,降低各部分的耦合程度,提高开发效率和可维护性。2、移动优先,跨屏适配 遵循 “移动...
三种UI+关键字卡控制+支持获取用户信息+支持强制关注, 集卡模块从一开始的版本到助力版本再到现在的新规则版本。 集卡模块难度主要在于: 如何控制各种不同的字卡组合,被粉丝集齐的数量。 如果不控制那么一定会...
随着互联网行业的不断发展,越来越多的人开始关注如何利用网络实现被动收益。而自动发卡网站便是其中一个比较热门的方式之一。最近,UI美化异次元自动发卡网搭建成为了一个备受关注的话题。本文将会介绍如何搭建这样...
字卡v4.3.4 原版 三种UI+关键字卡控制+支持获取用户信息+支持强制关注 集卡模块从一开始的版本到助力版本再到现在的新规则版本。 集卡模块难度主要在于 如何控制各种不同的字卡组合 被粉丝集齐的数量。 如果不控制...
UI测试最佳做法 在推特上关注我! 由我们的和构建和维护 目录 工具(1) 组件测试(3) 进阶(5) 现实生活中的例子(1) 1.... 1.1组件测试与(UI)集成测试与E2E测试 ... 如果可以的话,请避免自UI测试之旅开始以
字卡v4.3.4 原版 三种UI+关键字卡控制+支持获取用户信息+支持强制关注 没有教程,不会配置的勿下 集卡模块从一开始的版本到助力版本再到现在的新规则版本。 集卡模块难度主要在于 如何控制各种不同的字卡组合 被...
一直很关注自动化测试,因为手动进行测试很枯燥,而且容易遗漏相关测试。苹果在Xcode7中引入了UITesting,目前使用起来感觉良好。 一直很关注自动化测试,因为手动进行测试很枯燥,而且容易遗漏相关测试。苹果在...
开始为 BlackBerry® 设备设计应用程序时,请思考如何为用户带来丰富且引人入胜的个人体验。 大部分用 户希望应用程序直观且用起来令人满意。 考虑对于大部分用户都重要的附加属性。 例如,大部分游戏爱好 者希望玩...
工业设计开始关注非物质产品。但是在国内依然普遍存在这样一个称呼“美工”。“工”的意思就是没有思想紧紧靠体力工作的人。这是一个很愚昧的做法,愚昧在于称呼职员美工的企业没有意识到界面与交互设计能给他们带来...
creature、field 和 notification 几个模块分别表示用户能看到的生物体、战场和通知,但这它们并不关注 ui 的细节,而是直接使用 ui 模块中封装好的如 CreatureSprite 等各种 UI 元素。creature 等模块只关注实体的...
战神2概述Ares 2 是一个开源 ( ) 基于浏览器的代码编辑器和 UI 设计器,用于开发应用程序。 使用 Ares 2 制作的应用程序依赖于 Enyo 高度可移植的网络技术:它们是跨平台的(Linux/Mac/Windows、Android、/iOS/...
( 更新) — 维多利亚用户界面套件 Victoria UI Kit 是一个... 通读- 关注部分以了解库的构建方式和以了解已包含的内容。 如果您不确定如何为 GitHub 项目做出贡献,请先熟悉。 从。 要在本地机器上运行项目,请在
FloatingLabelTextFieldSwiftUI是一个小型轻量级的SwiftUI框架,它使用完全swiftUI(不使用UIViewRepresentable)编写,可以创建漂亮且可自定义的浮动标签文本字段! 该库支持RTL文本(例如阿拉伯语),并且易于在...
:warning: 这是仅在开始的过程中的工作。 敬请关注?? 联系人是使用CoreData和MVVM体系结构的SwiftUI生命周期应用程序的示例。 目的是提供各种与CoreData相关的代码的工作示例,以显示实体之间的相互关系和Swift...
所以,越来越多的人开始关注和使用,认为它可能是将来 Web 开发的主流工具。 这个项目本身也越滚越大,从最早的UI引擎变成了一整套前后端通吃的 Web App 解决方案。衍生的 React Native 项目,目标更是宏伟,希望用...
Flutter作为时下最流行的技术之一,凭借其出色的性能以及抹平多端的差异优势,早已引起大批技术爱好者的关注,甚至一些闲鱼,美团,腾讯等大公司均已开始使用。虽然目前其生态还没有完全成熟,但身靠背后的Google...
我从2014年1月4日开始这个项目。自从完成第一个测试版本以来,几乎每天都使用它。 是时候与世界分享它了。 :grinning_face_with_big_eyes: 有关更多详细信息,功能列表和屏幕截图请参见起始页 。 可在文档中找到...
您可能会发现一些有趣的事情:可组合架构整个应用程序由 ()提供支持, 是我们在上从头开始构建的库,它提供了用于构建应用程序的工具,重点关注可组合性,模块化和可测试性。 这表示: 整个应用程序的状态都保存...
所以,越来越多的人开始关注和使用,认为它可能是将来 Web 开发的主流工具。这个项目本身也越滚越大,从最早的UI引擎变成了一整套前后端通吃的 Web App 解决方案。衍生的 React Native 项目,目标更是宏伟,希望用写...