PDA

View Full Version : معادل clrscr و gotoxy در جاوا



Hamid.zaeimpoor
دوشنبه 21 تیر 1389, 09:42 صبح
سلام
من خیلی دنبال این 2 تا دستور جاوا گشتم ولی چیزی پیدا نکردم اگه کسی می دونه کمک کنه لطفا!:اشتباه:

billguess
دوشنبه 21 تیر 1389, 17:49 عصر
سلام
من خیلی دنبال این 2 تا دستور جاوا گشتم ولی چیزی پیدا نکردم اگه کسی می دونه کمک کنه لطفا!:اشتباه:
برای پاک کردن صفحه راههای زیادی وجود دارد به نظرم به ++Cآشنا می آیید پس از یک کار ترکیبی استفاده میکنیم البته این روش آسان ترین راه نیست
[این توضیحات بر پایه IDEخاصی نیست]
1-ابتدا یک فایل بسازید و کد زیر را در آن کپی کنید از این کلاس بعداً به عنوان اینترفیس کار استفاده می شود

class Hamid {

public static final short FOREGROUND_BLACK = 0x0;
public static final short FOREGROUND_BLUE = 0x1;
public static final short FOREGROUND_GREEN = 0x2;
public static final short FOREGROUND_RED = 0x4;
public static final short FOREGROUND_WHITE = 0x7;
public static final short FOREGROUND_INTENSITY = 0x8;

public static final short BACKGROUND_BLUE = 0x10;
public static final short BACKGROUND_GREEN = 0x20;
public static final short BACKGROUND_RED = 0x40;
public static final short BACKGROUND_INTENSITY = 0x80;

public native void cls();
public native void setCursorPosition( short x, short y);
public native void keepColors();
public native void restoreColors();
public native void setColor( short foreground, short background);
static {
System.loadLibrary("jni3");
}
}حال این کلاس را در مسیر نصب JDKپوشه BINکپی کنید یا اگر آن در مسیرPATH است که هیچ
فایل بالا را ابتدا کامپایل کنید سپس به HEADERفایل تبدیل کنید چون می خواهیم با++Cروی آن کار کنیم
بعد از این مرحله شما باید یک فایل به اسمHamid.hداشته باشید با محتویات زیر


#include <jni.h>
/* Header for class Hamid */

#ifndef _Included_Hamid
#define _Included_Hamid
#ifdef __cplusplus
extern "C" {
#endif
#undef Hamid_FOREGROUND_BLACK
#define Hamid_FOREGROUND_BLACK 0L
#undef Hamid_FOREGROUND_BLUE
#define Hamid_FOREGROUND_BLUE 1L
#undef Hamid_FOREGROUND_GREEN
#define Hamid_FOREGROUND_GREEN 2L
#undef Hamid_FOREGROUND_RED
#define Hamid_FOREGROUND_RED 4L
#undef Hamid_FOREGROUND_WHITE
#define Hamid_FOREGROUND_WHITE 7L
#undef Hamid_FOREGROUND_INTENSITY
#define Hamid_FOREGROUND_INTENSITY 8L
#undef Hamid_BACKGROUND_BLUE
#define Hamid_BACKGROUND_BLUE 16L
#undef Hamid_BACKGROUND_GREEN
#define Hamid_BACKGROUND_GREEN 32L
#undef Hamid_BACKGROUND_RED
#define Hamid_BACKGROUND_RED 64L
#undef Hamid_BACKGROUND_INTENSITY
#define Hamid_BACKGROUND_INTENSITY 128L
/*
* Class: Hamid
* Method: cls
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Hamid_cls
(JNIEnv *, jobject);

/*
* Class: Hamid
* Method: setCursorPosition
* Signature: (SS)V
*/
JNIEXPORT void JNICALL Java_Hamid_setCursorPosition
(JNIEnv *, jobject, jshort, jshort);

/*
* Class: Hamid
* Method: keepColors
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Hamid_keepColors
(JNIEnv *, jobject);

/*
* Class: Hamid
* Method: restoreColors
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Hamid_restoreColors
(JNIEnv *, jobject);

/*
* Class: Hamid
* Method: setColor
* Signature: (SS)V
*/
JNIEXPORT void JNICALL Java_Hamid_setColor
(JNIEnv *, jobject, jshort, jshort);

#ifdef __cplusplus
}
#endif
#endif

بعد از این به یک DLLنیاز داریم این رو می تونید مثلاً در VSبسازید با این شکل

#include "stdafx.h"
#include <stdlib.h>
#include "Hamid.h"

int originalColors;

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}


JNIEXPORT void JNICALL Java_Hamid_cls
(JNIEnv *env, jobject obj) {

HANDLE hConsole;
unsigned long * hWrittenChars = 0;
CONSOLE_SCREEN_BUFFER_INFO strConsoleInfo;
COORD Home;
static unsigned char EMPTY = 32;

Home.X = 0;
Home.Y = 0;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsole, &strConsoleInfo);
FillConsoleOutputCharacter(hConsole, EMPTY,
strConsoleInfo.dwSize.X * strConsoleInfo.dwSize.X, Home,
hWrittenChars);
SetConsoleCursorPosition(hConsole, Home);
// system("cls"); will do the same as the above!
}

JNIEXPORT void JNICALL Java_Hamid_setCursorPosition
(JNIEnv *env, jobject obj, jshort x, jshort y) {

HANDLE hConsole;
COORD coordScreen;

hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
coordScreen.X = x;
coordScreen.Y = y;
SetConsoleCursorPosition( hConsole, coordScreen );

}

JNIEXPORT void JNICALL Java_Hamid_setColor
(JNIEnv *env, jobject obj, jshort foreground, jshort background) {
HANDLE hConsole;

hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, foreground + background);
}

JNIEXPORT void JNICALL Java_Hamid_keepColors
(JNIEnv *env, jobject obj) {
HANDLE hConsole;
CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;

hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsole, &ConsoleInfo);
originalColors = ConsoleInfo.wAttributes;
}

JNIEXPORT void JNICALL Java_Hamid_restoreColors
(JNIEnv *env, jobject obj) {
HANDLE hConsole;

hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, originalColors);
}پس حالا یک DLLهم داریم
حالا در آخرین مرحله ساده ترین کار استفاده از این توابع بومی شده برای کتابخانه جاوا می باشد فقط فایل های فوق در کنار هم در یک مسیر باشند




public class JNIJavaclrscr {

public static void main(String[] args) {

Hamid jht = new Hamid();

System.out.printf("Enter First Name: Mr.Hamid");

System.out.printf("Enter Last Name:zaeimpoor ");



// clear the screen
jht.cls();

System.out.printf("Full Name: %s %s%n%n",Hamid.zaeimpoor);

}
}امیدوارم طولانی بودن این راه شما رو ناراحت نکرده باشه پاک کردن صفحه به سیستم عاملی که در حال استفاده از آن هستید هم ربط داره مثلاً در ویندوز 9x

System.out.print(((char) 27)+"[2J"); جواب می ده یا اگه در Config.sysویندوز اکس پی Ansi.SYSلود شده باشه میشه از کد بالا هم استفاده کرد
در یونیکس و سیستم وی کد پایین جواب می ده



System.out.print("/033");
System.out.print("/f");

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

for (int i=0; i<YourRowNo; ++i) System.out.println();به جای YourRowNoهر عددی بگذارید همون تعداد سطر،صفحه رو براتون تر وتمیز می کنه
دز این مجال این چند راه به ذهنم رسید اگر راه دیگری به ذهنم رسید یا یادم آمد حتماً مجدداً می گذارم

billguess
دوشنبه 21 تیر 1389, 18:42 عصر
و در مورد gotoxy باید اضافه کنم که د رهمان فایل آخر با افزودن متدهای زیر به برنامه برنامه امکان پذیر است

آرگومان متد

jht.setCursorPosition( ...x... , ...y... );
مکان نما را منتقل می کندو
رنگ پس و پیش در زمینه نیز با

jht.setColor(...Fore... , .Back.....);
قابل تغییر است

با سپاس

LORD AELX
دوشنبه 21 تیر 1389, 20:17 عصر
سلام
من خیلی دنبال این 2 تا دستور جاوا گشتم ولی چیزی پیدا نکردم اگه کسی می دونه کمک کنه لطفا!:اشتباه:

برای clrscr میتونید مثل همان اتفاقی که در bash لینوکس اتفاق می افتد، عمل کنید. یعنی چند خط خالی چاپ کنید تا دستورات قبلی در بالای console مخفی شوند. همچنین می توانید با استفاده از دستور:



Runtime runtime=Runtime.getRuntime();
runtime.exec("cls");
از تابع خود DOS COMMAND برای پاک کردن صفحه بهره ببرید. (که البته فقط روی ویندوز جواب می دهد.)

روش دیگری که وجود دارد استفاده از کد زیر است (برای درک این موضوع اینجا (http://academic.evergreen.edu/projects/biophysics/technotes/program/ansi_esc.htm) را مطالعه کنید):



String ANSI_CLEAR_SEQ = "\u001b[2J";
System.out.println(ANSI_CLEAR_SEQ);
ضمنا برای انتقال cursor به مکان مشخص (gotoxy) می توانید از کتابخانه Java Curses Library (http://sourceforge.net/projects/javacurses/) استفاده نمایید. (گرچه برای JAVA Applet تابعی به خود نام gotoxy وجود دارد.)

موفق باشید :قلب: