ورود

View Full Version : سوال: paging در جاوا



m44miri
جمعه 27 اسفند 1389, 08:32 صبح
از دوستان کسی هست که یک لینکی چیزی در مورد paging در جاوا را بدونه چطوری میشه پیاده کرد؟
چیزی شبیه به jQGrid .که هم grid باشه هم table هم paging
ممنون میشم

javaphantom
جمعه 27 اسفند 1389, 10:07 صبح
از دوستان کسی هست که یک لینکی چیزی در مورد paging در جاوا را بدونه چطوری میشه پیاده کرد؟
چیزی شبیه به jQGrid .که هم grid باشه هم table هم paging
ممنون میشم

اگر منظورت اینکه فرض کن ۱۰۰۰ رکورد در database داری و می خوای مثلا ۱۰۰ تا ۱۰۰ نشون بدی درJTable یا هر UI اگر داری از یک ORM استفاده می کنی کار خیلی راحت هست فقط کافی هست تنظیم کنی که چند رکود رکود هر با برات بیاره

اگر داری jdbc می زنی به این query دقت کن


1. select * from ( select *, ROWNUM as rnum from table where ROWNUM <= "upperLimit" order by 1 ) where rnum > "lowerLimit"

فقط هر بار باید مقدار upperlimit , lowerlimit رو براش بفرسی که از رکورد شماره چند تا چند رو برات بیاره

m44miri
جمعه 27 اسفند 1389, 10:17 صبح
ممنون از جوابتون اما من قصد ندارم با دیتابیس کار کنم... بلکه من قصد دارم اطلاعات را از سرور ایمیل استخراج کنم...مثل evolution در لینوکس و اطلاعات را ۱۰ تا ۱۰ تا نمایش بدم..
یعنی در جاوا کامپوننت یا api نداریم که کار من را راه بندازه؟

javaphantom
جمعه 27 اسفند 1389, 14:52 عصر
ممنون از جوابتون اما من قصد ندارم با دیتابیس کار کنم... بلکه من قصد دارم اطلاعات را از سرور ایمیل استخراج کنم...مثل evolution در لینوکس و اطلاعات را ۱۰ تا ۱۰ تا نمایش بدم..
یعنی در جاوا کامپوننت یا api نداریم که کار من را راه بندازه؟

خوب اون لسیت پیوندی که داری توش اطلاعات رو بصورت object نگه می داری مقدار for ی که داری می زنی برای نشون دادن اطلاعات محدود کن. در هر صورت تو باید لیستی از یک سری Object توی table نشون بدی درسته.
شایدم من هنوز دقیق مشکل رو نفهمیدم

m44miri
جمعه 27 اسفند 1389, 15:44 عصر
ممنون..فکر کنم یچیزایی فهمیدم .
پس باید انتهای حلقه for را بدست بیارم و بعد مثلا 10 تا 10 تا در table نمایش بدم..
قربونت میشه یه مثال کوچولو بزاری اینجا؟!! یکمی درکش برام سخته ...
فکر کنم درست متوجه شدی..یچیزی مثل این http://www.datatables.net/
گوشه پایین سمت راست جدول ببین paging زده و 10 تا 10 تا نشون میده
یک سوال دیگه هم ازت دارم که مربوط به EJB میشه... اول میخوام این مشکلم حل بشه بعد اونو هم میپرسم..که البته بی تعارف میدونم استاد EJB هستی شما

javaphantom
شنبه 28 اسفند 1389, 14:56 عصر
ممنون..فکر کنم یچیزایی فهمیدم .
پس باید انتهای حلقه for را بدست بیارم و بعد مثلا 10 تا 10 تا در table نمایش بدم..
قربونت میشه یه مثال کوچولو بزاری اینجا؟!! یکمی درکش برام سخته ...
فکر کنم درست متوجه شدی..یچیزی مثل این http://www.datatables.net/
گوشه پایین سمت راست جدول ببین paging زده و 10 تا 10 تا نشون میده
یک سوال دیگه هم ازت دارم که مربوط به EJB میشه... اول میخوام این مشکلم حل بشه بعد اونو هم میپرسم..که البته بی تعارف میدونم استاد EJB هستی شما


من برای حل مشکل تو با فرض اینکه یک سری اطلاعات در یک آرایه لیستی گذاشتیم مشکل رو حل کردم.
فرض کردم ۲۰ رکورد داریم که می تونیم بصورت پویا مقدار خوند رو تغییر بدیم. مثل یک بار بگیم ۵ تا ۵ تا یا بگیم ۲ تا ۲ تا

کلاس User که قرار ۲۰ رکود از اون درست بشه

کد :

package com.babak;

/**
* Created by IntelliJ IDEA.
* User: Babak
* Date: 3/18/11
* Time: 7:17 PM
* To change this template use File | Settings | File Templates.
*/
public class User {

private String name;

private String family;

private String Id;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getFamily() {
return family;
}

public void setFamily(String family) {
this.family = family;
}

public String getId() {
return Id;
}

public void setId(String id) {
Id = id;
}
}


کلاس DataFactory کهد در سازنده خودش 20 رکورد از User می سازه و یک متدود getUserByPage که داستان اصلی کار ماهست. با دو فیلد کنترلی مهم

کد :


package com.babak;

import java.util.LinkedList;
import java.util.List;

/**
* Created by IntelliJ IDEA.
* User: Babak
* Date: 3/18/11
* Time: 7:16 PM
* To change this template use File | Settings | File Templates.
*/
public class DataFactory {

private LinkedList<User> users = new LinkedList<User>();
private int upper;
private int lower;
private LinkedList<User> usersPrime = new LinkedList<User>();

public DataFactory() {

for (int i = 0; i < 20; i++) {
User user = new User();
user.setName("babak " + i);
user.setFamily("azarmi " + i);
user.setId(i + 1 + "");
users.add(user);
}
}


public List<User> getUsersByPage(int lowerBound, int upperBound,boolean forward) throws Exception {


if (lowerBound >= upperBound) throw new Exception();

usersPrime.clear();


if (forward) {



if (upperBound > users.size()) {
upperBound = upperBound - lowerBound;
lowerBound = 0;
this.upper = upperBound;
this.lower = lowerBound;
}



for (int i = lowerBound; i < upperBound; i++) {
usersPrime.add(users.get(i));
}

} else {

if (upperBound == 0) {

upperBound = this.users.size();
lowerBound = upperBound + lowerBound;

lower = lowerBound;
upper = upperBound;


}

if (upperBound > users.size()) {
upperBound = upperBound - lowerBound;
lowerBound = 0;
this.upper = upperBound;
this.lower = lowerBound;
}


for (int i = upperBound - 1 ; i > lowerBound -1; i--) {
usersPrime.add(users.get(i));
}

}
return usersPrime;
}



public int getUpper() {
return upper;
}

public void setUpper(int upper) {
this.upper = upper;
}

public int getLower() {
return lower;
}

public void setLower(int lower) {
this.lower = lower;
}
}


کلاس MyTableModel که مدلی هست برای نمایش دادن اطلاعات و با کلاس datafactory صحبت می کنه.


package com.babak;

import javax.swing.table.DefaultTableModel;

/**
* Created by IntelliJ IDEA.
* User: Babak
* Date: 3/18/11
* Time: 7:28 PM
* To change this template use File | Settings | File Templates.
*/
public class MyTableModel extends DefaultTableModel {


private String column[] = {"id", "name", "family"};


private DataFactory dataFactory;
private Object obj[] = new Object[3];
private int page;


/**
* Constructs a default <code>DefaultTableModel</code>
* which is a table of zero columns and zero rows.
*/
public MyTableModel(int page) {
this.page =page;
this.dataFactory = new DataFactory();
this.dataFactory.setUpper(page);
setData(true);


}


private void setData(boolean b) {
int counter = 0;

try {
for (User user : dataFactory.getUsersByPage(dataFactory.getLower(), dataFactory.getUpper(),b)) {
if (counter == 5) {
break;
}
obj[0] = user.getId();
obj[1] = user.getName();
obj[2] = user.getFamily();
this.addRow(obj);
counter++;
}
} catch (Exception e) {
e.printStackTrace();
}

}


public void addRowsByPageForward() {
dataFactory.setLower(this.dataFactory.getUpper());
dataFactory.setUpper(dataFactory.getLower() + this.page);
this.removeRows();
setData(true);
}

public void addRowsByPageBackward() {


dataFactory.setUpper(dataFactory.getLower());
dataFactory.setLower(dataFactory.getUpper() - page);

this.removeRows();
setData(false);
}


public void removeRows() {

while(this.getRowCount() !=0) {
this.removeRow(this.getRowCount()-1);
}
}

/**
* Returns the number of rows in this data table.
*
* @return the number of rows in the model
*/
@Override
public int getColumnCount() {
return this.column.length;
}


/**
* Returns the column name.
*
* @return a name for this column using the string value of the
* appropriate member in <code>columnIdentifiers</code>.
* If <code>columnIdentifiers</code> does not have an entry
* for this index, returns the default
* name provided by the superclass.
*/
@Override
public String getColumnName(int column) {
return this.column[column];
}
}



کلاس MyFrame‌ هم که نقاشی نشون می ده و کلیدهای جلو و عقب که با MyTableModel حرف می زنند.


package com.babak;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
* Created by IntelliJ IDEA.
* User: Babak
* Date: 3/18/11
* Time: 7:20 PM
* To change this template use File | Settings | File Templates.
*/
public class MyFrame extends JFrame {

private JTable myTable;
private JPanel myPanel;
private JButton forward;
private JButton backward;
private MyTableModel myTableModel =new MyTableModel(5);
// private int counter = 5;

public MyFrame() {
this.setBounds(new Rectangle(300,300));
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.getContentPane().add(this.getMyPanel());
this.setVisible(true);
}

public JTable getMyTable() {
if (this.myTable == null) {
this.myTable = new JTable();
this.myTable.setModel(myTableModel);
}
return myTable;
}

public JPanel getMyPanel() {
if (this.myPanel == null) {
this.myPanel = new JPanel();
// this.myPanel.setLayout(new FlowLayout());
this.myPanel.add(this.getMyTable());
this.myPanel.add(this.getBackward());
this.myPanel.add(this.getForward());

}
return myPanel;
}

public JButton getForward() {
if (this.forward == null) {
this.forward = new JButton(">>");
this.forward.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
myTableModel.addRowsByPageForward();
}
});

}
return forward;
}

public JButton getBackward() {
if(this.backward == null) {
this.backward = new JButton("<<");
this.backward.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
myTableModel.addRowsByPageBackward();
}
});
}
return backward;
}

public static void main(String[] s) {
new MyFrame();
}
}


توی این قسمت از کد اگر بکنیش 2 اون وقت 2 تا ۲ تا می یاره یا هر عددی


private MyTableModel myTableModel =new MyTableModel(2);

m44miri
شنبه 28 اسفند 1389, 20:29 عصر
اوه ..اوه :متعجب:
بابا کلی خجالتم دادی ... :خجالت:
از اینکه اینهمه وقت گذاشتی و جز به چز برام نوشتی ممنونم...
خوب ..اون سوالی که در مورد EJB داشتمو نمی دونم اینجا میشه پرسید یا نه.!!
البته قبلا پرسیدم ولی جواب درسو درمونی نگرفتم..
ایشالا یه فرجی بشه.
ببین فرض کندر EJB اطلاعاتی قراره برای کلاینت ارسال بشه آیا در زمانی که قراره این اطلاعات از سرور به کلاینت load بشه میشه از progress استفاده کرد؟ منظورم اینه که درصد پیشرفت loading را در EJB در قسمت کلاینت با progress نمایش داد.
راستش من بلدم از thread استفاده کنم اما با وجودی که خیلی سرچ کردم اما چیزی ندیدم در موردش.
شما که با ejb زیاد سروکار داری تا حالا این کارو کردی؟
اگه آره میشه به منم یاد بدی :قلب:

javaphantom
شنبه 28 اسفند 1389, 23:57 عصر
اوه ..اوه :متعجب:
بابا کلی خجالتم دادی ... :خجالت:
از اینکه اینهمه وقت گذاشتی و جز به چز برام نوشتی ممنونم...
خوب ..اون سوالی که در مورد EJB داشتمو نمی دونم اینجا میشه پرسید یا نه.!!
البته قبلا پرسیدم ولی جواب درسو درمونی نگرفتم..
ایشالا یه فرجی بشه.
ببین فرض کندر EJB اطلاعاتی قراره برای کلاینت ارسال بشه آیا در زمانی که قراره این اطلاعات از سرور به کلاینت load بشه میشه از progress استفاده کرد؟ منظورم اینه که درصد پیشرفت loading را در EJB در قسمت کلاینت با progress نمایش داد.
راستش من بلدم از thread استفاده کنم اما با وجودی که خیلی سرچ کردم اما چیزی ندیدم در موردش.
شما که با ejb زیاد سروکار داری تا حالا این کارو کردی؟
اگه آره میشه به منم یاد بدی :قلب:

EJB Container یک ظرف یا یک container ی هست که یکی از وظایفش مدیریت طول عمر component هایی است که ejb هستند هست و در قسمت سرور وجود داره. یعنی اگر عملی منطقی مثل جمع یا تفریق در این component ها تعریف شده باشه کاملا در قسمت سرورد و با مدیریت و درخواست client در container و بهتر بگم در JVM ی که در سمت server هست داره انجام می شه. مثلا اگر از طرف کلاینت درخواستی مبتنی بر این باشه که کل باقی مانده حساب بانکی من چقدر هست فرستاده بشه به سمت سرور محاسبات در اون سمت داره انجام می شه. مثال دیگه تو وقتی میری پای دستگاه ATM پول بگیری ممکن ۳ دقیقه طول بکشه که ازاین دستگاه در طریق سویچها ی مختلف به سرور بانکی مربوط دسترسی پیدا کنی و ۲ دقیقه هم طول بکشه مقدار پول خواسته شده برات برگرده. اینجا کلا شما ۵ دقیقه الاف شدی. توی ۵ دقیقه الافی ماشین ATM برات تبلغ می زاره ولی هیچ گونه تخمینی که کارت 5 دقیقه طول می کشه یا ۳۰ ثانیه نمی تونه داشته باشه پس چیزی به عنوان progress bar معنی نمیده. progress bar موقعی معنی پیدا می کنه که شما جحم data یا یک فاکتوری ثابت رو بدونی که بتونی بر اساس اون حرکتی بزنی.
تو این مسائل که هیچ ربطی هم به ejb نداره شما برا ساس چه فاکتوری می تونی زمان درست تخمین بزنی.؟ شاید سرور خیلی با روش باشه. شاید خط بصورت نرمال برای اولین با connection نده. و و و و. پس کلا progress مفهومی نداره. از نظر من

m44miri
یک شنبه 29 اسفند 1389, 08:38 صبح
متوجه شدم... خیلی خوب توضیح دادی...
یک سوال دیگه هم دارم ازت ...
آیا میشه موقعی که اطلاعات را از سرور درخواست میکنیم و داره از jvm سرور به jvm کلاینت منتقل میشه از یک آیکون waiting استفاده کرد ؟ تا کاربر متوجه بشه که application در حال پردازش یا دریافت اطلاعات از سروره.
من میتونم با دو thread روی یک کلاینت ساده این کارو بکنم ولی وقتی کلاینت از ejb درخواست میکنه آیکون waiting اصلا رفرش نمیشه...همونجوری ثابت میمونه...
توضیح:منظورم از آیکون waiting یک آیکن gif که چند لایست و انیمیشن داره.مثل اینا : http://www.andrewdavidson.com/articles/spinning-wait-icons/
/ (http://www.andrewdavidson.com/articles/spinning-wait-icons/)

javaphantom
یک شنبه 29 اسفند 1389, 16:37 عصر
متوجه شدم... خیلی خوب توضیح دادی...
یک سوال دیگه هم دارم ازت ...
آیا میشه موقعی که اطلاعات را از سرور درخواست میکنیم و داره از jvm سرور به jvm کلاینت منتقل میشه از یک آیکون waiting استفاده کرد ؟ تا کاربر متوجه بشه که application در حال پردازش یا دریافت اطلاعات از سروره.
من میتونم با دو thread روی یک کلاینت ساده این کارو بکنم ولی وقتی کلاینت از ejb درخواست میکنه آیکون waiting اصلا رفرش نمیشه...همونجوری ثابت میمونه...
توضیح:منظورم از آیکون waiting یک آیکن gif که چند لایست و انیمیشن داره.مثل اینا : http://www.andrewdavidson.com/articles/spinning-wait-icons/
/ (http://www.andrewdavidson.com/articles/spinning-wait-icons/)

نیازی به thread بازی نداره. اگر کلاینت تو web هست یعنی داره رو browser دیتا می گیره که thread نمی خواد یک عکس هست که بلافاصله بعد از اینکه کلاینت درخواست رو زد نشون می دی و بعد از اینکه کار lookup تمام شد و object اومده null نبود عکس رو بر می داری. اگر کلاینت تو swing بود اونم به هم چنین می تونی یک module باز کنی یا همون JDialogFrame اگر اشتباه نکنم و بلافاصله تا دیدی object اومد اینور کار تمومه.

m44miri
دوشنبه 01 فروردین 1390, 10:42 صبح
اما اگر ترافیک شبکه زیاد باشه ارسال و بازگشت اطلاعات به کلاینت طول میکشه... در این زمانها فقط نوشتن جمله "در حال بارگزاری اطلاعات..." یا چیزی مثل این برای آگاه کردن کاربر زیاد جالب نیست.. یک آیکن loading گزینه بهتریه