ورود

View Full Version : سوال: JButton و به دام انداختن رویداد



sh_omid
دوشنبه 14 تیر 1389, 19:16 عصر
سلام
من یک کامپوننت که از jbutton مشتق شده ، ساختم و می خواهم هر وقت کاربر روی دکمه کلید Enter را زد دستوراتی که در actionPerformed کامپوننت نوشته ، اجرا شود ولی این طور نمی شود!چیکار کنم؟
کد کامپوننت به صورت زیر است :

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

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.Serializable;
import javax.swing.JButton;

/**
*
* @author omid
*/
public class jcompbutton extends JButton implements Serializable, KeyListener, ActionListener {
public jcompbutton() {
super();
this.setFont(new java.awt.Font("Tahoma", 0, 11));
this.setPreferredSize(new java.awt.Dimension(75, 23));

this.addActionListener(this);

this.addKeyListener(this);

}

public void keyTyped(KeyEvent e) {

}

public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
actionPerformed(null);
}
}

public void keyReleased(KeyEvent e) {

}

public void actionPerformed(java.awt.event.ActionEvent evt) {
nextFocus();
}
}

jlover
سه شنبه 15 تیر 1389, 05:58 صبح
لطفاً از علامت کد در این ویرایشگر برای قرار دادن کدهاتون استفاده کنید (علامت #)...

من امتحانش کردم، و مشکلی نداشت! همون کاری که میخاستید رو انجام میداد: با فشردن کلید اینتر، می پرید روی دکمه ی بعدی (من از سه تا دکمه ی JButton استفاده کردم که سازنده شون سازنده ی کلاس شما بود)

البته فکر نمی کنم این روش مناسبی برای این کار باشه...

sh_omid
سه شنبه 15 تیر 1389, 17:37 عصر
شما اگر کامپوننت رو روی فرم قرار دهید و در actionPerformed آن عملی را انجام دهید در هنگام زدن Enter آن عمل انجام نمی شه و فقط nextfocus() کار می کند
به نظر شما چیکار کنم؟

billguess
چهارشنبه 16 تیر 1389, 18:08 عصر
شما اگر کامپوننت رو روی فرم قرار دهید و در actionPerformed آن عملی را انجام دهید در هنگام زدن Enter آن عمل انجام نمی شه و فقط nextfocus() کار می کند
به نظر شما چیکار کنم؟

با سلام

من ابتدا یک فایل به اسم test1.javaساختم بعد کد شما رو واردش کردم و بعد یک فرم هم به برنامه اضافه کردم و مخلص کلام شد یک برنامه کوچک که تعداد دفعات اجرای action performedرو برای هر تعداد دکمه به طور جداگانه می شمره البته فعلا فقط دوتا دکمه اضافه کردم


package Chapter1;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.Serializable;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

final class jcompbutton extends JButton implements Serializable, KeyListener, ActionListener {

public jcompbutton()
{
super();

this.setFont(new java.awt.Font("Tahoma", 0, 11));
this.setPreferredSize(new java.awt.Dimension(175, 45));
this.addActionListener(this);
this.addKeyListener(this);

}
//To Accounting
int cnt=0;

//You Added It(Sh_Omid)
public void keyTyped(KeyEvent e)
{

}

public void keyPressed(KeyEvent e)
{

if (e.getKeyCode() == KeyEvent.VK_ENTER)
actionPerformed(null);
}


public void keyReleased(KeyEvent e)
{

}

public void actionPerformed(java.awt.event.ActionEvent evt)
{

++cnt;
JOptionPane.showConfirmDialog(null,"Dear Sh_Omid:\n ActionPerformed for \""+this.getText()+"\" runs\t"+cnt+" Times");

}

}

public class test1 {
public static void main(String[] args) {
jcompbutton btn1=new jcompbutton();
jcompbutton btn2=new jcompbutton();
JFrame form =new JFrame();
JPanel panel=new JPanel();

panel.add(btn1);
panel.add(btn2);

form.setSize(220, 170);


btn1.setText("Button One");
btn2.setText("Button Two");


form.getContentPane().add(panel);

form.setDefaultCloseOperation(form.EXIT_ON_CLOSE);
form.setVisible(true);
}

}

sh_omid
پنج شنبه 17 تیر 1389, 09:58 صبح
درسته ، اما من می گم اگر شما روی همان فرمتان روی دکمه دوبار کلیک کنید و در actionPerform آن کدی را بنویسید در زمان اجرا هنگامی که کاربر روی دکمه Enter را می زند کد نوشته شده اجرا نمی شه

billguess
پنج شنبه 17 تیر 1389, 20:07 عصر
درسته ، اما من می گم اگر شما روی همان فرمتان روی دکمه دوبار کلیک کنید و در actionPerform آن کدی را بنویسید در زمان اجرا هنگامی که کاربر روی دکمه Enter را می زند کد نوشته شده اجرا نمی شه



احتمالاً منظور شما این است که در زمان طراحی یعنی قبل از اجرا روی دکمه کلیک کنید و فکر می کنم که از NetBeans IDEهم استفاده می کنید و دکمه تان را هم به شکل Drag and Dropبه فرم تان اضافه کردید

حالا این بار این کار را انجام دهید:
روی همان دکمه مورد نظرتان در زمان طراحی کلیک راست کنید ودر منویی که باز می شود در بخش رویدادها رویداد مورد نظر خودتان حالا KeyPressیاهرچی که مایلید را انتخاب کنید و در آن بخش مستقیماً کد دلخواه را بیفزایید(من با نت بینز کار نمی کنم و دقیقاً گزینه های منو آن را نمی دانم ولی حتماً یک چیز شبیه همین است)

sh_omid
جمعه 18 تیر 1389, 16:12 عصر
من نمی خوام برای تمام دکمه ها این کار رو بکنم می خوام فقط یکبار آن را در داخل کامپوننت انجام بدم ، نه اینکه هی توی طراحی اینکار انجام بدم ، شاید من 100تا فرم داشته باشم و داخل هر فرم هم 5 دکمه داشته باشم ، آیا به نظر شما عقلانی چنین کاری بکنم؟

billguess
شنبه 19 تیر 1389, 01:52 صبح
من نمی خوام برای تمام دکمه ها این کار رو بکنم می خوام فقط یکبار آن را در داخل کامپوننت انجام بدم ، نه اینکه هی توی طراحی اینکار انجام بدم ، شاید من 100تا فرم داشته باشم و داخل هر فرم هم 5 دکمه داشته باشم ، آیا به نظر شما عقلانی چنین کاری بکنم؟
بنده نمونه برنامه ای خدمتتان تقدیم کردم که در action performکد دلخواه را اجرا می کرد و به قول شما 500دکمه هم اختصاص می دادم دیگر برای هر کدام کدی نمی نوشتم ،من از IDEهم استفاده نمی کردم حالا اگر گفتم یکبار از آن طریق امتحان بفرمایید جهت حصول اطمینان بود.

sh_omid
چهارشنبه 23 تیر 1389, 18:33 عصر
فکر کنم شما هنوز متوجه منظور من نشده اید!!!
وقتی که شما در زمان طراحی ، شی ای از این کامپوننت را روی فرم قرار می دهید و در acteionPerformed آن دستوری را تایپ می کنید در زمان اجرا با زدن Enter آن دستور اجرا نمی شود

admis2010
چهارشنبه 23 تیر 1389, 20:05 عصر
من كه از اين چيزهايي كه گفتيد سر در نياوردم :متفکر:
ولي اگه مي خوايد با tab روي يه سري jbutton پيمايش كنيد و وقتي دكمه enter زده مي شه دستورات jbutton انتخاب شده انجام شه بايد بگم توي java بايد به جاي enter دكمه space را بزنيد .
اگر هم حتماً‌ مي خواهيد enter كار space را انجام دهد من توي پست هاي قبل ديدم كه آقاي Jlover اين كار رو بلده از ايشون بپرسيد .

javaphantom
پنج شنبه 24 تیر 1389, 09:02 صبح
سلام
من یک کامپوننت که از jbutton مشتق شده ، ساختم و می خواهم هر وقت کاربر روی دکمه کلید Enter را زد دستوراتی که در actionPerformed کامپوننت نوشته ، اجرا شود ولی این طور نمی شود!چیکار کنم؟
کد کامپوننت به صورت زیر است :

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

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.Serializable;
import javax.swing.JButton;

/**
*
* @author omid
*/
public class jcompbutton extends JButton implements Serializable, KeyListener, ActionListener {
public jcompbutton() {
super();
this.setFont(new java.awt.Font("Tahoma", 0, 11));
this.setPreferredSize(new java.awt.Dimension(75, 23));

this.addActionListener(this);

this.addKeyListener(this);

}

public void keyTyped(KeyEvent e) {

}

public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
actionPerformed(null);
}
}

public void keyReleased(KeyEvent e) {

}

public void actionPerformed(java.awt.event.ActionEvent evt) {
nextFocus();
}
}



هر دفعه enter می زنی برات یک کار می کنه کافی این adapter رو روی هر کلیدی که خواستی بزاری



import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

/**
* Created by IntelliJ IDEA.
* User: zack
* Date: Jul 15, 2010
* Time: 9:09:03 AM
* To change this template use File | Settings | File Templates.
*/
public class Main {

private JFrame jFrame;

private JButton jButton;


public Main() {
jFrame = new JFrame();
jButton = new JButton();
jButton.addKeyListener(new MyKeyAdapter());
jFrame.getContentPane().add(jButton);
jFrame.setVisible(true);
}

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


}


class MyKeyAdapter extends KeyAdapter {

/**
* Invoked when a key has been released.
*/
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == 10) {
System.out.println("hello");
}
}
}

sh_omid
پنج شنبه 24 تیر 1389, 12:18 عصر
بازهم نشد!!!


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

import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.Serializable;
import javax.swing.JButton;

/**
*
* @author omid
*/
public class jcompbutton extends JButton implements Serializable, ActionListener {
public jcompbutton() {
super();

this.setFont(new java.awt.Font("Tahoma", 0, 11));
this.setPreferredSize(new java.awt.Dimension(75, 23));

this.addActionListener(this);
this.addKeyListener(new KeyAda());
}

public void actionPerformed(java.awt.event.ActionEvent evt) {
nextFocus();
}


class KeyAda extends KeyAdapter{

@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == 10) {
actionPerformed(null);
}
}
}

}




من كامپوننت بالا را درست کردم ولی هنگامی این کامپوننت را روی فرم قرار می دهم و در actionPerformed آن دستوری می نویسم در زمان اجرا با زدن Enter اجرا نمی شه

javaphantom
پنج شنبه 24 تیر 1389, 14:58 عصر
import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

/**
* Created by IntelliJ IDEA.
* User: zack
* Date: Jul 15, 2010
* Time: 9:09:03 AM
* To change this template use File | Settings | File Templates.
*/
public class Main {

private JFrame jFrame;

private JButton jButton;


public Main() {
jFrame = new JFrame();
jButton = new JButton();
jButton.addKeyListener(new MyKeyAdapter(this));
jFrame.getContentPane().add(jButton);
jFrame.setVisible(true);
}


public void actionPerformance() {
System.out.println("do some thing");
}

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


}


class MyKeyAdapter extends KeyAdapter {

private Main main;

public MyKeyAdapter(Main main) {
this.main = main;
}

/**
* Invoked when a key has been released.
*/
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == 10) {
main.actionPerformance();
}
}
}

این دیگه کار می کنه