开始关注下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);
}
}
}
在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值