ورود

View Full Version : مشکل در سوییچ بین text field



abdoullah.aberi
چهارشنبه 29 مرداد 1393, 13:02 عصر
سلام دوستان من در حال حاضر چند textfield دارم میخوام به صورت دلخواه بین انها سوییچ کنم با زدن tab key نمیدونم چطوری این کار رو میشه کرد ممنون میشم اگه کمکم کنید

vahid-p
چهارشنبه 29 مرداد 1393, 14:59 عصر
به ترتیبی که اد کردی، خودش اینکار رو واستون انجام میده

محمد فدوی
چهارشنبه 29 مرداد 1393, 17:04 عصر
اگر میخوای دستی Focus رو جابجا کنی از متد ()requetFocus استفاده کن:

jTextField.requestFocus();

abdoullah.aberi
پنج شنبه 30 مرداد 1393, 02:25 صبح
خوب من 6 تا textfield کنار هم دارم سه تا یه سمت راست و سه تا سمت چپ وقتی اینا میچینی با زدن tab از چپ به راست focus میکنه ولی من می خوان اول textfield های سمت راست بعد سمت چپ رو focus کنم میشه یه مثال از این requestFocus بزارین لطفا ممنون از راهنماییاتون موفق باشین

محمد فدوی
پنج شنبه 30 مرداد 1393, 19:25 عصر
اصولی ترین راه پیاده سازی یه نمونه از کلاس تجریدی FocusTraversalPolicy و ست کردن اون با متد Container::setTraversalPolicy هستش. برات این نمونه کد رو گذاشتم. امیدوارم بتونی ازش ایده بگیری:

package test;
import ... // Import Somethings!


public class FocusPractice extends JFrame {


private static final int ROWS = 8;
private static final int COLS = 7;


public FocusPractice() {
super("Tab Practice");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new GridBagLayout());


JTextField[] fields = new JTextField[ROWS * COLS];

GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 1, 1,
GridBagConstraints.BASELINE, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0);

for (int i = 0; i < fields.length; i++, gbc.gridy++) {
if(gbc.gridy == ROWS) {
gbc.gridy = 0;
gbc.gridx++;
}

fields[i] = new JTextField(String.format("[%d, %d]", gbc.gridx, gbc.gridy), 10);
add(fields[i], gbc);
}

// MAIN POINT:
setFocusTraversalPolicy(new MyFocusModel(fields));


pack();
}


public static void main(String[] args) {
new FocusPractice().setVisible(true);
}
}


class MyFocusModel extends FocusTraversalPolicy {
private final JTextField[] fields;

MyFocusModel(JTextField[] fields) {
this.fields = fields;
}

@Override
public Component getComponentAfter(Container cont, Component comp) {
for(int i = 0; i < fields.length; i++) {
if(fields[i].equals(comp)) {
return i == fields.length - 1 ? getFirstComponent(cont) : fields[i + 1];
}
}
return null;
}


@Override
public Component getComponentBefore(Container cont, Component comp) {
for(int i = 0; i < fields.length; i++) {
if(fields[i].equals(comp)) {
return i == 0 ? getLastComponent(cont) : fields[i - 1];
}
}

return null;
}


@Override
public Component getFirstComponent(Container cont) { return fields[0]; }


@Override
public Component getLastComponent(Container cont) { return fields[fields.length - 1]; }


@Override
public Component getDefaultComponent(Container cont) { return fields[0]; }
}




با این حال راه های دیگه ای هم هست که شاید کوتاه تر هم باشن. مثلا تغییر دستی Focus وقتی کلید Tab زده میشه... ولی من این راه رو بت پیشنهاد میکنم.
موفق باشی.

vahid-p
پنج شنبه 30 مرداد 1393, 19:56 عصر
requsetFocus کاربردش یه چیز دیگست. باید رخدادی پیش بیاد که بتونی requestFocus رو فراخوانی کنی.
مگر اینکه روی textField سومتون چنین چیزی قرار بدید. فکر نمیکنم متد آماده ای برای اینکار باشه، تو متدهای textField چک کردم چیزی نبود.
دو راه داری. یا برای هر textField بعدی رو مشخص کنی از طریق تشخیص کلید tab و استفاده از requestFocus
ولی یه راه دیگه اینه که از دو JPanel استفاده کنی و هر ستون رو در یک JPanel قرار بدی و از Layout ها برای این منظور استفاده کنی.
کد پایین رو به صورتی نوشتم که اول ستون سمت چپ رو چک میکنه بعد سمت راست. تقریبا همون چیزیه که میخواید :

setLayout(new FlowLayout());
setSize(300, 200);
JPanel panel1=new JPanel(new GridLayout(3, 1));
JPanel panel2=new JPanel(new GridLayout(3, 1));
JTextField field1=new JTextField(10);
JTextField field2=new JTextField(10);
JTextField field3=new JTextField(10);
JTextField field4=new JTextField(10);
JTextField field5=new JTextField(10);
JTextField field6=new JTextField(10);
panel1.add(field1);
panel1.add(field2);
panel1.add(field3);
add(panel1);
panel2.add(field4);
panel2.add(field5);
panel2.add(field6);
add(panel2);

vahid-p
پنج شنبه 30 مرداد 1393, 19:59 عصر
اینم هست : http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html#customFocusTraversal

Babak25th
پنج شنبه 30 مرداد 1393, 20:22 عصر
سپاس از این تاپیک////

abdoullah.aberi
جمعه 31 مرداد 1393, 00:58 صبح
ممنون از دوستان عزیز مرسی به جواب رسیدم امیدوارم علاوه بر من کسایی که این تاپیک رو میخونن به جواب برسن بازن از همه ممنون