PDA

View Full Version : نیاز به کمک فوری در مورد کامبوباکس(ComboBox)



imanEsmaeili
پنج شنبه 20 خرداد 1389, 10:01 صبح
با سلام
من در مراحل آخر تولید یک پروژه اپلیکیشن می باشم و به کمک نیاز دارم.
در هنگام ثبت اطلاعات يك ركورد لازم است كه مقدار يك فيلد از جدول ديگري انتخاب شود
فرض كنيم جدول ديگر دو فيلد دارد يكي"کد کتاب"و ديگري"نام کتاب" .
من مقادیر را از جدول دیگر بازیابی کرده ام و ستون نام کتاب را در یک کامبو باکس قرار داده ام.
حال مي خواهيم با استفاده از این combobox به محض اينكه كاربر بخشي از نام کتاب مورد نظر را وارد كرد بلافاصله combobox باز شود و تمام اطلاعاتي كه شامل مقدار وارد شده مي باشد فيلتر شده و به نمايش در آيد و كاربر هر كدام را خواست انتخاب كند.
از دوستان عزيز اگر كسي راه حلي داره ممنون ميشم منو كمك كنه
:عصبانی++:

soheril.server
یک شنبه 23 خرداد 1389, 21:52 عصر
با سلام
من در مراحل آخر تولید یک پروژه اپلیکیشن می باشم و به کمک نیاز دارم.
در هنگام ثبت اطلاعات يك ركورد لازم است كه مقدار يك فيلد از جدول ديگري انتخاب شود
فرض كنيم جدول ديگر دو فيلد دارد يكي"کد کتاب"و ديگري"نام کتاب" .
من مقادیر را از جدول دیگر بازیابی کرده ام و ستون نام کتاب را در یک کامبو باکس قرار داده ام.
حال مي خواهيم با استفاده از این combobox به محض اينكه كاربر بخشي از نام کتاب مورد نظر را وارد كرد بلافاصله combobox باز شود و تمام اطلاعاتي كه شامل مقدار وارد شده مي باشد فيلتر شده و به نمايش در آيد و كاربر هر كدام را خواست انتخاب كند.
از دوستان عزيز اگر كسي راه حلي داره ممنون ميشم منو كمك كنه
:عصبانی++:

با سلام،

دوست عزیز یکم باید برای نوشتنش حوصله به خرج بدید، بنده اینجا به اختصار مراحل کار رو براتون توضیح میدم:

1. باید دایما" فیلد رو کنترل کنید (این کار رو میتونید با سوکت انجام بدید)، تا به محض اینکه کاربر تغیری در فیلد ایجاد کرد، شما متوجه بشید

2.بعد فیلد رو gettext کنید

3.String گرفته شده رو بفرستید به تابعی که وظیفش فیلتر کردنه Database بر اساس String ی است که شما به عنوان آرگومان بهش دادید(منظور از فیلتر کردن اینجا همون Search کردنه)

4.نتایج گرفته شده رو بگیرید و در Combobox بریزید( میتونید یه حلقه for درست کنید که به تعداد نتایج گرفته شده میچرخه، بعد در هر بار چرخش یه String به Combobox اضافه کنید...)

-----> اگه مرحله ی یک رو درست انجام بدید، برنامه دایما" به صورت اتوماتیک آپدیت میشه و در حقیقت اون سوکتتون به عنوان هسته ی اصلی آپدیت برنامه عمل میکنه...

امیدوارم خوب توضیح داده باشم...سوالی داشتید در خدمتم...

imanEsmaeili
دوشنبه 24 خرداد 1389, 15:49 عصر
خیلی ممنون از لطفتون دوست عزیز
منم تو همون مرحله یکش موندم، خواستم با رویداد (key press)بنویسم که موفقیت آمیز نبود
یعنی چرا تا حدودی درست بود، از مرحله 2 تا مرحله آخرش درست کار میکرد اما تو مرحله 1 وقتی می خواست تشخیص بده که چه لحظه ای کلید رو کامبوباکس فشرده میشه ، کار نمی کرد
دقیقا تو مرحله یکش مشکل دارم
خواهش میکنم اگه کد خاصی در دسترستون هست یا تا حالا انجام دادین، اگه ممکنه بزارین تو تالار
ممنونم

imanEsmaeili
سه شنبه 25 خرداد 1389, 12:32 عصر
دوستان گرامی لطفا اگه کمکی از دستتون بر میاد انجام بدین
خیلی خیلی درگیر انجامش هستم، دیگه کاملا کلافه شدم
ممنونم

jlover
سه شنبه 25 خرداد 1389, 22:00 عصر
خیلی ممنون از لطفتون دوست عزیز
منم تو همون مرحله یکش موندم، خواستم با رویداد (key press)بنویسم که موفقیت آمیز نبود
یعنی چرا تا حدودی درست بود، از مرحله 2 تا مرحله آخرش درست کار میکرد اما تو مرحله 1 وقتی می خواست تشخیص بده که چه لحظه ای کلید رو کامبوباکس فشرده میشه ، کار نمی کرد
دقیقا تو مرحله یکش مشکل دارم
خواهش میکنم اگه کد خاصی در دسترستون هست یا تا حالا انجام دادین، اگه ممکنه بزارین تو تالار
ممنونم

من درباره ی کاری که میخواید انجام بدین تجربه ای ندارم، اما در این مورد خاص، آیا رویداد keyTyped رو امتحان کردید؟

imanEsmaeili
دوشنبه 31 خرداد 1389, 13:19 عصر
با تشکر
بله دوست عزیز از رویداد های key type , key pressed نیز استفاده کردم ولی برای کامبو باکس جواب نمیده
لطفا راهنمایی کنین

jlover
چهارشنبه 02 تیر 1389, 17:03 عصر
با تشکر
بله دوست عزیز از رویداد های key type , key pressed نیز استفاده کردم ولی برای کامبو باکس جواب نمیده
لطفا راهنمایی کنین
خب دوست گرامی؛
من خودم این روزها دارم برای مسئله ای که حل می کنم از combo box استفاده می کنم. رو این حساب خیلی باهاش سر و کله زدم، مستندات و خودآموزهای سان رو در این رابطه خوندم و الان هم باید برم یه نگاهی به کدهای منبعش بندازم...

JComboBox یک مولفه ی مرکب محسوب میشه و گرچه امکان افزودن شنودگرهای سطح پایین مثل کلید رو داره (چون زیرکلاسی از Component هست)، اما در واقع این رویداد هیچ اثری روش نداره!
از The Java Tutorials داریم:


Although JComboBox inherits methods to register listeners for low-level events — focus, key, and mouse events, for example — we recommend that you don't listen for low-level events on a combo box. Here's why: A combo box is a compound component — it is comprised of two or more other components. The combo box itself fires high-level events such as action events. Its subcomponents fire low-level events such as mouse, key, and focus events. The low-level events and the subcomponent that fires them are look-and-feel-dependent. To avoid writing look-and-feel-dependent code, you should listen only for high-level events on a compound component such as a combo box.

بعد از آخرین پستتون به سوال اولتون بیشتر دقت کردم (می دونید که فهمیدن مسئله یعنی رفتن نصف راه حل...)، و بدون در نظر گرفتن قسمتهای مربوط به پایگاه داده و جدول و این چیزا که متاسفانه هنوز تجربه ای درباره شون ندارم، فکر می کنم اگه درست متوجه منظورتون شده باشم، برنامه ی نمونه ای که در زیر قرار میدم، باید احتمالاً با کمی اغماض کاری که گفتید رو براتون انجام بده:



import java.awt.FlowLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.ComboBoxEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

/**
*
* @author Esmaeil Ashrafi <s.ashrafi@gmail.com>
*/
public class ComboBoxDemo {

static JComboBox box;
static ComboBoxEditor editor;

//static String s0 = new String();
static String s1 = new String("یک");
static String s2 = new String("یکتا");
static String s3 = new String("دو");
static String s4 = new String("یکی بود یکی نبود");
static String s5 = new String("حساب");
static String s6 = new String("دوزخ");
static String s7 = new String("حسابان");
static String s8 = new String("دوران");
static final String[] values = { s1, s2, s3, s4, s5, s6, s7, s8};
static StringBuffer typedChars = new StringBuffer();

public static void main(String[] args) {

box = new JComboBox();
box.setEditable(true);
editor = box.getEditor();
editor.getEditorComponent().addKeyListener(new ComboBoxEditorKeyListener());

JFrame frame = new JFrame();
frame.setLayout(new FlowLayout());
frame.add(box);
//box.setComponentOrientation(ComponentOrientation.R IGHT_TO_LEFT);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(3);
}

static class ComboBoxEditorKeyListener extends KeyAdapter {

@Override
public void keyTyped(KeyEvent e) {
//box.removeAllItems();
int key = e.getKeyChar();
if (key == KeyEvent.VK_BACK_SPACE) {
System.out.println("BackSpace!");
if (typedChars.length() > 1) {
typedChars.deleteCharAt(typedChars.length() - 1);
} else if (typedChars.length() == 1) {
typedChars.deleteCharAt(typedChars.length() - 1);
box.removeAllItems();
box.hidePopup();
return;
} else {
return;
}
}
else if (key != KeyEvent.VK_ENTER & key != KeyEvent.VK_ESCAPE
& key != KeyEvent.VK_DELETE) {
typedChars.append(e.getKeyChar());
}
else{
System.out.println("escape or enter");
return;
}
box.removeAllItems();
box.addItem(typedChars);
//box.addItem("");
System.out.println("typedValue: " + typedChars);
for (String value : values) {
//System.out.println("typedValue: "+typedChars);
//System.out.println("value: "+value);
if (value.startsWith(typedChars.toString())) {
box.addItem(value);

}
}
box.showPopup();
//typedChars.replace(0, typedChars.length(), "");
}
}

}


البته به دلایلی ممکنه کمی پیچیده به نظر برسه، دارم سعی می کنم راه ساده تری براش پیدا کنم....

فقط لطفاً ببینید منظروتون همین بوده یا نه ؟

jlover
چهارشنبه 02 تیر 1389, 19:55 عصر
خب، این یکی بهتره:



import java.awt.FlowLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.ComboBoxEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;

public class ComboBoxDemo2 {

static JComboBox box;
static ComboBoxEditor editor;

static final String s1 = new String("یک");
static final String s2 = new String("یکتا");
static final String s3 = new String("دو");
static final String s4 = new String("یکی بود یکی نبود");
static final String s5 = new String("حساب");
static final String s6 = new String("دوزخ");
static final String s7 = new String("حسابان");
static final String s8 = new String("دوران");
static final String[] values = {s1, s2, s3, s4, s5, s6, s7, s8};


public static void main(String[] args) {

box = new JComboBox();
box.setEditable(true);
editor = box.getEditor();
editor.getEditorComponent().addKeyListener(new ComboBoxEditorKeyListener());

JFrame frame = new JFrame();
frame.setLayout(new FlowLayout());
frame.add(box);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(3);
}

static String oldValue;

static class ComboBoxEditorKeyListener extends KeyAdapter {

@Override
public void keyPressed(KeyEvent e){
keyReleased(e);
}
@Override
public void keyReleased(KeyEvent e) {
String typedValue = (String) editor.getItem();
if (typedValue.equals("") || typedValue.equals(oldValue)){
box.hidePopup();
return;
}
oldValue = typedValue;
System.out.println("tryped value obtained by getItem: "+typedValue);
box.removeAllItems();
box.addItem(typedValue);
for (String value : values){
if (value.startsWith(typedValue)){
box.addItem(value);
}
}
box.revalidate();
box.showPopup();
}
}

}

imanEsmaeili
پنج شنبه 03 تیر 1389, 14:40 عصر
دوست عزیز بسیار سپاسگزارم از راهنماییتون
بله دقیقا همون چیزی بود که میخواستم
فقط دو تا نقص داره
اول اینکه وقتی دکمه های upو down رو میزنیم بتونه بین گزینه های ظاهر شده پایین بالا بکنه
بعدش اون گزینه ای که در حال حاضر داریم مینویسیم نباید جزء یکی از گزینه های ظاهر شده در لیست کامبوباکس باشه
البته من همین الان کدتون رو تست کردم و خودم هنوز وقت مطالعه ش رو نداشتم
خودم حتما رو این گزینه ها کار می کنم و اگه به نتایجی رسیدم مطمئنا شما رو مطلع می کنم
بازم سپاسگزار و از اینکه ایرادها رو مطرح کردم قصد جسارت نداشتم فقط جهت تکمیل کار گفتم
متشکرم

jlover
دوشنبه 07 تیر 1389, 01:41 صبح
دوست عزیز بسیار سپاسگزارم از راهنماییتون
بله دقیقا همون چیزی بود که میخواستم
فقط دو تا نقص داره
اول اینکه وقتی دکمه های upو down رو میزنیم بتونه بین گزینه های ظاهر شده پایین بالا بکنه
بعدش اون گزینه ای که در حال حاضر داریم مینویسیم نباید جزء یکی از گزینه های ظاهر شده در لیست کامبوباکس باشه
البته من همین الان کدتون رو تست کردم و خودم هنوز وقت مطالعه ش رو نداشتم
خودم حتما رو این گزینه ها کار می کنم و اگه به نتایجی رسیدم مطمئنا شما رو مطلع می کنم
بازم سپاسگزار و از اینکه ایرادها رو مطرح کردم قصد جسارت نداشتم فقط جهت تکمیل کار گفتم
متشکرم

دوست گرامی؛
هدف بنده مهیا کردن دقیق اون چیزی که شما مد نظرتون هست نبود!

زمانیکه مختصات یک مسئله بصورت دقیق روشن نشه، انتظار گرفتن یک پاسخ دقیق و کاملاً
صحیح بیجاست. من چه خبر از زیر و بم برنامه ی شما و اینکه ذهنتون دقیقاً دنبال چی هست دارم!؟
کما اینکه مواردی که می فرمایید هم در پستهای قبلیتون بهش اشاره ای نشده بود.


هدف من:

* کم کردن روی این مولفه ! (کامبوباکس) که بسادگی در مقابل رویدادهای صفحه کلید واکنش نشون نمیداد، و تمرین و تحقیق درباره ش و همینطور درباره ی رویدادهای صفحه کلید
(اینا شخصی بود بیشتر)

* فراهم کردن یک برنامه ی نمونه که بتونه به صورت کلی، رهیافت نیازمندی ای که شما مطرح فرمودید رو ارایه بده و به عنوان یک راهکار عمومی و یک منبع در اختیار همه ی بازدیدکننده ها باشه
که نکته ی اساسی در بکارگیری شنودگر صفحه کلید برای این مولفه، کار روی ادیتورش هست..


از این رو هیچ کدوم از نقصها رو وارد نمی دونم.

اگرچه در مورد دکمه های up و down که فرمودید، اگر منظور کلیدهای up/down arrow keys باشه، باز هم بدون کوچکترین ویرایشی در کدها، این کار انجام میشه. و اگر هم منظورتون page up/page down باشه که خب چون به طور پیشفرض خوب جواب نمیده ظاهراض، باید زحمت بکشید و شنودگر کلید رو در واکنش به این دو تا کلید توسعه بدید و هر بار یک شمارنده رو کاهش/افزایش بدید و از اون بعنوان اندیس ارجاع روی آیتمهای باکس (از اولین تا آخرین قلم) استفاده کنید...

مورد بعدی:


بعدش اون گزینه ای که در حال حاضر داریم مینویسیم نباید جزء یکی از گزینه های ظاهر شده در لیست کامبوباکس باشه


حال مي خواهيم با استفاده از این combobox به محض اينكه كاربر بخشي از نام کتاب مورد نظر را وارد كرد بلافاصله combobox باز شود و تمام اطلاعاتي كه شامل مقدار وارد شده مي باشد فيلتر شده و به نمايش در آيد و كاربر هر كدام را خواست انتخاب كند.


:متفکر:


راستش می دونید من چی فکر می کنم؟ دلیلی نداره که حتماً از کامبو باکس استفاده بشه و این همه باهاش سروکله زد!
برای کاری که شما میخاید انجام بدید، می تونستید یه فیلد متن به کار ببرید، براش شنودگر صفحه کلید تعریف کنید، یه کمبوباکس ساده (غیر قابل ویرایش) یا حتی یه JList (من باهاش کار نکردم تا حالا اما عکسهای توی The Java Tutorials و همچنین خود اسمش به نظر خیلی مناسب میاد) رو درست زیر اون فیلد متن قرار میدادید و اقلام متناسب با حروف تایپ شده توسط کاربر رو در اون نمایش میدادید...

به هر حال این کار شماست که باید تکمیل بشه و توسط خودتون هم انجام میشه، چرا که کسی بهتر از خودتون نمیدونه که شما دنبال چی هستید دقیقاً.

من هم این موارد رو عرض کردم تا روشن بشه که در یک برنامه، نقص با ویژگی ای که میل دارید وجود داشته باشه، اما وجود نداره، تفاوت داره.

نقص، یعنی انتظار میره که یک برنامه، فلان کار رو برای مثال انجام بده، ولی اون برنامه اون کار رو انجام نمیده یا به درستی انجام نمیده. یا بدتر از همه ی اینها دارای خطا، استثناءات گمانه زنی نشده، مقاومت پایین در برابر شرایط مختلف ووو

از این برنامه انتظاراتی که میرفت، با توجه به دو پست اول تاپیک، مهیا شد.
به علاوه خمیره ی کار در اختیار همه هست.

موفق باشید.

imanEsmaeili
دوشنبه 07 تیر 1389, 10:38 صبح
ممنونم از راهنمایی تون دوست عزیز
شما کاملا درست می فرمایید
بابت تلاشتون هم تشکر میکنم