PDA

View Full Version : دریافت کاراکتر بدون نیاز به زدن enter



far2009
پنج شنبه 01 دی 1390, 14:39 عصر
سلام دوستان

می خواستم بدونم چطوری میشه یک کاراکتر را به عنوان ورودی گرفت در حالی که نیاز نباشه کاربر بعد از نوشتن کاراکتر کلید enter را بزنه .
راستش من هنوز تو جاوا تازه کارم و هنوز خیلی با شی هم آشنا نیستم . تا حدودی کار با متد را می دونم. پس یک جوری ساده توضیح بدید ممنون می شوم.

اگر بشه هم یک نمونه کد که یک کاراکتر را به همین روش بگیره و فقط چاپ کنه بگذارید هم خیلی کمک کردید

spiderman200700
پنج شنبه 01 دی 1390, 21:12 عصر
درود بر شما.
یکی دو سال پیش من خودم خواستم همچین کاری رو انجام بدم، خیلی تحقیق کردم و آخرش به این نتیجه رسیدم که جاوا همچین امکانی رو توی کتابخونش قرار نداده.
تصمیم گرفتم خودم یه کلاس رو برای این کار بنویسم.

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;

class Scanner extends JDialog {

private char ch;

public Scanner() {
super(new JFrame(), "", true);
//setUndecorated(true);
setResizable(false);
setAlwaysOnTop(true);
}

public char getchar() {
JButton b = new JButton();
b.addKeyListener(new KeyAdapter() {

@Override
public void keyPressed(KeyEvent e) {
ch = e.getKeyChar();
setVisible(false);
}
});
add(b);
setVisible(true);
return ch;
}
}

اینم یه مثال از استفاده از این کلاس:
public class key {

public static void main(String args[]) {
System.out.println("Enter Statement: ");
Scanner sc = new Scanner();
System.out.println(sc.getchar());
}
}

وقتی متد getchar از کلاس Scanner رو صدا بزنی، منتظر میمونه تا یه کاراکتر رو وارد کنی و اونو به بدنه ی اصلی برنامه برمی گردونه.

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

و اینکه شما گفتی که میخوای بدون کلاس این کاری رو انجام بدی.
در این مورد باید بگم که توی جاوا بدون کلاس امکان نداره حتی بتونی یه خط نوشته هم توی خروجی چاپ کنی.اصلا جاوا بدون کلاس یعنی هیچ.
پس سعی کن مفاهیم کلاس ها رو خوب یاد بگیری.

far2009
جمعه 02 دی 1390, 11:59 صبح
اول ممنون که لطف کردید و پاسخ دادید .

من کد شما را تو netbeans امتحان کردم . خوشبختانه synthax error نداشت .

ولی نمی دونم شایدم مشکل از من باشه ، این کد را که اجرا می کنم برنامه می خواد که کاراکتر بگیره ولی با زدن یک کاراکتر برنامه تمام نمیشه و حتی با زدن چند تا کاراکتر هم برنامه عکس العملی نشون نمیده .
و مشکل دوم اینه که حتی با زدن enter هم باز برنامه می خواد کاراکتر بگیره و به سراغ بقیه کدها نمیره.

من برنامه شما را به شکل زیر تغییر دادم . طبق آنچه که من مد نظرم هست این برنامه باید پس از اجرا با زدن هر کاراکتری بدون نیاز به زدن enter عدد 6 چاپ بشه. ولی این اتفاقات به دلایل فوق نمی افته.

public class Main {


public static void main(String[] args) {


System.out.println("Enter Statement: ");
Scanner sc = new Scanner();

char a = sc.getchar();


System.out.println(6);

}
}

spiderman200700
جمعه 02 دی 1390, 19:46 عصر
گفتم که برنامه یه سری مشکلات داره،یعنی جاوا در این مورد محدودیت هایی به وجود میاره.
از برنامه باید اینجوری استفاده کنی:
برنامه رو که اجرا کردی دیگه به موس اصلا دست نزن و کاراکتری رو که میخوای وارد کن.اینجوری برنامه درست عمل میکنه.
هر جا هم که خواستی برنامه بسته بشه از این دستور اسفاده کن:
System.exit(0);

far2009
جمعه 02 دی 1390, 22:26 عصر
درسته بدون تکان دادن موس درست کار می کنه ولی متاسفانه من نیاز به این تکان دادن موس دارم.

راستش خودم یه موردش را تو اینترنت پیدا کردم ولی این هم با اینکه در حالت کلی درست کار می کنه ولی یک مشکل بسیار ساده داره


متد keyTyped که کاراکتر را می خونه یک حالت loop مانند داره اما این خودش مشکل نیست ، مشکل اون جاست که من می خوام به i مدام مقدار اضافه کنم و چون راهی جز مقدار دهیش تو خود متد بلد نیستم به خاطر این تو loop افتادن مدام مقدار i به حالت اول برمیگرده ! استفاده از while قبل از خواندن کاراکتر سبب هنگ کردن برنامه میشه

مشکل به اون بزرگی حل شد حالا یک نکته خیلی ریز دردسر ساز شده

شما ظاهرا تو جاوا حرفه ای هستید میشه این کد را برای من ساده اش کنید . حتی اگه بشه jframe را هم حذف کرد خیلی بهتر میشه .

import java.awt.Color;
import java.awt.Font;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JTextPane;
/*
* Created on Jul 24, 2005
*
*/

public class MainFrame extends JFrame implements KeyListener {

JTextPane j;

public MainFrame() {
super("title");
setBounds(0, 0, 640, 480);
setDefaultCloseOperation(EXIT_ON_CLOSE);
j = new JTextPane();
j.setBackground(Color.BLACK);
j.setForeground(Color.LIGHT_GRAY);
j.setFont(new Font("courier", Font.BOLD, 15));
setBounds(0, 0, 640, 480);
setDefaultCloseOperation(EXIT_ON_CLOSE);
j = new JTextPane();


j.addKeyListener(this);
getContentPane().add(j);
setVisible(true);
}

public void keyPressed(KeyEvent arg0) {
// skip it, just need to implement it
}

public void keyReleased(KeyEvent arg0) {
// skip it, just need to implement it
}

public void keyTyped(KeyEvent arg0) {
double i=0;

char c;

c = arg0.getKeyChar();

if (c == 'd') {
i += .05;

}
if (c == 'a') {
i -= .05;
}

StdDraw.line(i, .5, i, .1);


}

private void print(String s) {
j.setText(j.getText() + s);
}

private void println(String s) {
j.setText(j.getText() + s + "\n");
}

/**
* @param args
*/
public static void main(String[] args) {
new MainFrame();

}
}

spiderman200700
شنبه 03 دی 1390, 09:54 صبح
اولا این برنامه برای رسم خط ها با شیب های مختلف و فکر کنم برنامه ربطی به برنامه ای که شما خواستی نداره.
دوما حتی اگه بشه ربطش داد ، چون از JFrame مشتق میشه، اصلا modal نیست.یعنی منتظر دریافت کاراکتر نمیشه.
این کد،دریافت کاراکتر رو موازی با اجرای کد های دیگه انجام میده.

این ایرادها رو هم داره:
خط 27 کلا اضافس.
در خط 58 معلوم نیست که کلاس StdDraw از کجا اومده.خط روی چی رسم میشه.

saeedIRHA
دوشنبه 05 دی 1390, 08:15 صبح
http://barnamenevis.org/showthread.php?205365-%D9%85%D8%B4%D8%A7%D8%A8%D9%87-getch-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7&p=910845#post910845