PDA

View Full Version : Sort jTable



sg.programmer
سه شنبه 07 مهر 1388, 14:56 عصر
آیا این خاصیت وجود داره که با کلیک بر روی ستون های jTable اون ستون سورت بشه
مثل C#

alaaaa
سه شنبه 07 مهر 1388, 18:30 عصر
فکر کنم منظورتون همون Listview باشه.

کد زیر یک کلاس که می تونید به جای jtable ازش استفاده کنی




import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;


public class JListView extends JTable{

private static class SortTableModel extends AbstractTableModel{

private TableModel tableModel;
private int sortCulomn;
private boolean normalSort;
private Row[] tableRows;

private class Row implements Comparable{

public int index;
public int compareTo(Object o) {
Row second=(Row) o;
Object a=tableModel.getValueAt(index, sortCulomn);
Object b=tableModel.getValueAt(second.index, sortCulomn);
if(a instanceof Comparable){

if(a instanceof String){
String strA=((String) a).toLowerCase();
String strB=((String) b).toLowerCase();
if(normalSort)
return strA.compareTo(strB);
else
return strA.compareTo(strB)*(-1);
}
else{
if(normalSort)
return ((Comparable) a).compareTo(b);
else
return ((Comparable) a).compareTo(b)*(-1);
}
}
else
return index-second.index;
}

}

public SortTableModel(TableModel model){
tableModel=model;
tableRows=new Row[tableModel.getRowCount()];
for (int i = 0; i < tableRows.length; i++) {
tableRows[i] = new Row();
tableRows[i].index=i;
}

sortCulomn=-1;
normalSort=true;
}

private void sort(int culomn){
if(sortCulomn==culomn){
normalSort=!normalSort;
}
else{
sortCulomn=culomn;
normalSort=true;
}
Arrays.sort(tableRows);
fireTableDataChanged();
}

public int getRowCount() {
return tableModel.getRowCount();
}

public int getColumnCount() {
return tableModel.getColumnCount();
}

public Object getValueAt(int rowIndex, int columnIndex) {
return tableModel.getValueAt(tableRows[rowIndex].index, columnIndex);
}

@Override
public void setValueAt(Object value,int rowIndex, int columnIndex) {
tableModel.setValueAt(value, tableRows[rowIndex].index, columnIndex);
}

@Override
public String getColumnName(int columnIndex) {
return tableModel.getColumnName(columnIndex);
}

public void MouseAction(final JTable listView){
listView.getTableHeader().addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int selectedColumn=listView.columnAtPoint(e.getPoint() );
int modelColumn = listView.convertColumnIndexToModel(selectedColumn) ;
sort(modelColumn);
}
});
}
}

private SortTableModel model;

public JListView(Object[][] data,String[] columns) {
super();
model=new SortTableModel(new DefaultTableModel(data, columns));
this.setModel(model);
model.MouseAction(this);
}
}

sg.programmer
سه شنبه 07 مهر 1388, 20:58 عصر
سلام

من دارم از نت بینز 6.7 و بصورت ویژوال استفاده می کنم نمی دونم چطوری باید اینو به پروژه اضافه کنم اگه می تونی راهنمایم کن
تشکر

alaaaa
چهارشنبه 08 مهر 1388, 16:04 عصر
وقتی که به صورت visual یک jtable رو توی فرم می زاری در اصل یک jscrollpanel به فرمتون اضافه می شه که شامل یک jtable.
برای حل مشکلت اول jtable رو به صورت visual به فرمت اضافه کن بعداً jscrollpanel مربوط به اون رو پیدا کن (معمولاً اسم شی jscrollpane1 هست) بعد از اون به استفاده از متد setviewportview ، شی ساخته شده از jlistview رو داخل jscrollPanel قرار بده

sg.programmer
جمعه 10 مهر 1388, 09:59 صبح
سلام
دستتون درد نکنه
اگه براتون مقدوره یه مثال بزنید

sg.programmer
یک شنبه 10 آبان 1388, 13:42 عصر
یک نمونه برنامه می تونید قرار دهید

sg.programmer
دوشنبه 11 آبان 1388, 07:56 صبح
فکر کنم منظورتون همون Listview باشه.

کد زیر یک کلاس که می تونید به جای jtable ازش استفاده کنی




import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;


public class JListView extends JTable{

private static class SortTableModel extends AbstractTableModel{

private TableModel tableModel;
private int sortCulomn;
private boolean normalSort;
private Row[] tableRows;

private class Row implements Comparable{

public int index;
public int compareTo(Object o) {
Row second=(Row) o;
Object a=tableModel.getValueAt(index, sortCulomn);
Object b=tableModel.getValueAt(second.index, sortCulomn);
if(a instanceof Comparable){

if(a instanceof String){
String strA=((String) a).toLowerCase();
String strB=((String) b).toLowerCase();
if(normalSort)
return strA.compareTo(strB);
else
return strA.compareTo(strB)*(-1);
}
else{
if(normalSort)
return ((Comparable) a).compareTo(b);
else
return ((Comparable) a).compareTo(b)*(-1);
}
}
else
return index-second.index;
}

}

public SortTableModel(TableModel model){
tableModel=model;
tableRows=new Row[tableModel.getRowCount()];
for (int i = 0; i < tableRows.length; i++) {
tableRows[i] = new Row();
tableRows[i].index=i;
}

sortCulomn=-1;
normalSort=true;
}

private void sort(int culomn){
if(sortCulomn==culomn){
normalSort=!normalSort;
}
else{
sortCulomn=culomn;
normalSort=true;
}
Arrays.sort(tableRows);
fireTableDataChanged();
}

public int getRowCount() {
return tableModel.getRowCount();
}

public int getColumnCount() {
return tableModel.getColumnCount();
}

public Object getValueAt(int rowIndex, int columnIndex) {
return tableModel.getValueAt(tableRows[rowIndex].index, columnIndex);
}

@Override
public void setValueAt(Object value,int rowIndex, int columnIndex) {
tableModel.setValueAt(value, tableRows[rowIndex].index, columnIndex);
}

@Override
public String getColumnName(int columnIndex) {
return tableModel.getColumnName(columnIndex);
}

public void MouseAction(final JTable listView){
listView.getTableHeader().addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int selectedColumn=listView.columnAtPoint(e.getPoint() );
int modelColumn = listView.convertColumnIndexToModel(selectedColumn) ;
sort(modelColumn);
}
});
}
}

private SortTableModel model;

public JListView(Object[][] data,String[] columns) {
super();
model=new SortTableModel(new DefaultTableModel(data, columns));
this.setModel(model);
model.MouseAction(this);
}
}




لطفا یک مثال برای کار با این ارائه کنید

هانی هاشمی
پنج شنبه 14 آبان 1388, 22:49 عصر
jtable.setAutoCreateRowSorter(true);