这几天公司安排做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);
}
}
}
分享到:
相关推荐
UIDesigner,作为腾讯推出的一款专业UI设计工具,以其强大的功能和易用性在设计圈内备受关注。尤其是在1.1.1.0这个版本中,它突破了原有的局限,开始支持桌面程序的设计,为设计师们提供了更为广阔的创作空间。本文...
SAP UI5(用户界面5)是SAP公司开发的一个用于创建企业级Web应用程序的框架,特别是那些与SAP系统交互的应用程序。...开发者需要关注这些变化以确保他们开发的应用程序与最新版本兼容,并充分利用所有可用的UI5特性。
在IT行业中,UI(User Interface)项目是设计和开发用户界面的过程,主要关注软件或网站的外观、交互性和用户体验。UI设计师的任务是创造直观、美观且易于使用的界面,以提升用户的满意度和产品效率。本项目可能涵盖...
UI框架提供了预先设计的组件和样式,可以帮助开发者快速搭建界面,而无需从零开始。常见的UI框架有: 1. **Ant Design**:由阿里巴巴开发,适用于React应用,提供了一套完整的前端解决方案,包括丰富的UI组件和设计...
例如,如何处理触摸事件,如何动态更新UI,以及如何优化性能,这些都是深入研究SystemUI时需要关注的点。 总之,SystemUI 的启动是从 SystemServer 的 `startOtherServices()` 方法开始,通过启动 `SystemUIService...
4.3 ARIA支持:jQuery UI 1.8.2 版本已经开始关注无障碍访问(ARIA),确保组件对屏幕阅读器和其他辅助技术友好。 4.4 错误处理与调试:利用未压缩的开发版源码进行调试,了解组件内部工作原理,定位并解决问题。 ...
TinyUI的出现,就是为了让开发者无需过多关注这些底层细节,更专注于业务逻辑。这个库提供了丰富的控件集和布局管理功能,使得开发者能够快速构建出美观且功能完善的用户界面。 TinyUI的核心特性包括: 1. **轻量...
在HTML5的支持下,移动UI设计开始向着更为动态、互动性强且兼容性好的方向发展。 除了HTML5技术的推广使用外,移动UI发展趋势还包括以下几个方面: 1. 简洁化和扁平化设计:移动用户界面趋向于简洁明了的设计风格...
【EmptyProjectNet45_FineUI_v4.0.3】是基于.NET Framework 4.5的一个项目模板,专门设计用于快速搭建使用FineUI库的Web...此外,不断关注FineUI的更新和社区动态,可以帮助开发者保持对最新技术的了解,提升开发效率。
在本节《Qt 5.9 C++开始指南》中,我们将深入理解Qt的用户界面(UI)设计与运行机制,特别关注一个基于QWidget的主窗口应用程序实例。Qt是一个强大的跨平台开发框架,广泛用于创建桌面、移动和嵌入式应用,而Qt ...
"UI界面设计概念教程——从无到有界面设计畅想曲.docx"深入探讨了设计的概念,从零开始构建一个完整的界面,包括概念构思、草图绘制、模型制作到最终的实施。这个过程有助于设计师提升创新思维和实践能力。 六、UI...
在"Unity3D魔幻风格游戏UI界面按钮图标素材"这个资源包中,我们主要关注的是游戏用户界面(UI)的设计元素,特别是按钮和图标,这些都是构建游戏界面不可或缺的部分。 1. **UI设计**:UI是用户与游戏交互的窗口,它...
在“简单游戏UI(比较零散)”这个主题中,我们主要关注的是游戏中的一些基础元素和功能,如开始游戏、关卡选择、背景图片、怪物表示、确认操作、终极技能冷却时间的展示以及音效控制等。这些元素共同构成了一个游戏...
ligerUI的设计理念是“轻量、易用、强大”,其丰富的功能和良好的可定制性,使其在业界受到了广泛的关注和应用。 二、ligerUI的拖动效果(Draggable) ligerUI的拖动效果是通过`ligerDraggable`插件实现的,它允许...
在UI设计中,"Frozen UI" 主要关注的是提升用户体验和视觉美感。它包含了各种预设的组件,如按钮、表单、导航栏、网格系统、模态框、下拉菜单、轮播图等,这些元素都是构建现代网页和移动应用的基础。通过使用...
UI交互设计主要关注的是用户如何与产品或服务进行互动,通过优化用户界面来提升产品的可用性和用户满意度。这包括但不限于按钮、图标、布局等方面的设计。一个良好的UI设计不仅需要美观,还需要直观易用,能够引导...
前端开发,也称为客户端开发,主要关注用户在浏览器或应用中直接看到和交互的部分。这包括HTML、CSS和JavaScript等技术,它们共同构建了网页的结构、样式和动态功能。前端开发者通常要确保网页在各种设备和浏览器上...
2. **设置事件处理器**:我们需要关注两个主要事件:`DoWork`事件用于在后台执行任务,`ProgressChanged`事件用于更新UI的进度。 3. **启动异步操作**:在按钮点击事件或其他适当的地方,调用BackgroundWorker的`...
"UI UX Adobe XD"的标签揭示了这个资源集重点关注的是UI(用户界面)和UX(用户体验)设计,以及它们在Adobe XD中的应用。UI设计关注的是应用程序或网站的外观和交互方式,而UX设计则关注用户的感受和与产品的交互...
在开始制作UI之前,需要熟悉WOW的游戏文件结构,特别是MPQ文件格式。MPQ是Blizzard Entertainment用于存储游戏数据的压缩文件格式。WinMPQ是一款用于处理MPQ文件的工具,它可以用来解包和打包MPQ文件,以便开发者...