View Full Version : مقاله: مشخص کردن حداکثر تعداد کاراکتر در JTextField
java.source.ir
دوشنبه 22 تیر 1388, 18:04 عصر
به نام آنکه وجودم ز وجودش شده موجود
سلام
برای اینکه بتوانید حداکثر تعداد کاراکتر را در JTextField مشخص نمایید، باید خودتان اینکار را به صورت دستی تنظیم نمایید. چون زبان برنامه نویسی جاوا تا آنجا که من می دانم فاقد چنین متدی (بر خلاف زبانهای دیگر) می باشد. دو کلاس زیر را دانلود نمایید تا از این به بعد بتوانید به راحتی اینکار را انجام دهید.
کلاس Main: کلاس اصلی که باید آن را اجرا نمایید. این کلاس شامل یک JTextField است که حداکثر 10 کاراکتر را از کاربر قبول می نماید.
کلاس FixedSizePlainDocument: این کلاس در واقع کار کنترل تعداد کاراکترها را در JTextField برعهده دارد.
منبع: سایت java.sun.com
با نهایت احترام
Java Java
javaphantom
دوشنبه 22 تیر 1388, 21:10 عصر
به نام آنکه وجودم ز وجودش شده موجود
سلام
برای اینکه بتوانید حداکثر تعداد کاراکتر را در JTextField مشخص نمایید، باید خودتان اینکار را به صورت دستی تنظیم نمایید. چون زبان برنامه نویسی جاوا تا آنجا که من می دانم فاقد چنین متدی (بر خلاف زبانهای دیگر) می باشد. دو کلاس زیر را دانلود نمایید تا از این به بعد بتوانید به راحتی اینکار را انجام دهید.
کلاس Main: کلاس اصلی که باید آن را اجرا نمایید. این کلاس شامل یک JTextField است که حداکثر 10 کاراکتر را از کاربر قبول می نماید.
کلاس FixedSizePlainDocument: این کلاس در واقع کار کنترل تعداد کاراکترها را در JTextField برعهده دارد.
منبع: سایت java.sun.com
با نهایت احترام
Java Java
بابا مهندس یعنی override کردن یک متدود که کلا ۳ خط می شه این همه باید دنگ و فنگ داشته باشه که بری چند صد مگ کلاس و فلان تشکیلات دانلود کنی.
استفاده از امکانات زبان و مفاهیم object oriented برای کسی که مفهوم رو بدونه نیازی به این نیست که حتما یک property داشته باشیم که برامون مقدار این jtextfield رو محدود کنه.
به این قسمت نگاه کن
this.jTextField1 = new JTextField();
this.jTextField1.setColumns(10);
this.jTextField1.setDocument(new PlainDocument() {
/**
* control the lenght of jTextField1
*/
@Override
public void insertString(int offs, String str, AttributeSet a) {
try {
if (offs == 4) {
throw new BadLocationException(str, offs);
}
super.insertString(offs, str, a);
} catch (BadLocationException e) {
Toolkit.getDefaultToolkit().beep();
}
}
});
کلا می شه ۵ خط . دیگه مقاله علمی و گزارش و تعلیم و تربیت نمی خواد. مطالعه می خواد که نمی کنی. زمان می خواد که نمی زاری.
تازه من می تون خیلی حرفی ای تر به این مسئله نگاه کنم و کاری کنم که بصورت یک property عمل کنه که مثل الان اینجا من بصورت استاتیک تعریف کردم و همیشه تا چهار حالا به این یکی کد نگاه کن
import java.awt.FlowLayout;
import java.awt.Rectangle;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
/**
*
* @author root
*/
public class MyFrame extends JFrame {
private JPanel jPanel1;
private JTextField jTextField1;
public MyFrame() {
this.jPanel1 = new JPanel();
this.jPanel1.setLayout(new FlowLayout());
this.jTextField1 = new JTextField();
this.jTextField1.setColumns(10);
this.jTextField1.setDocument(new MyDocument(6));
// this.jTextField1.setDocument(new PlainDocument() {
// /**
// * control the lenght of jTextField1
// */
// @Override
// public void insertString(int offs, String str, AttributeSet a) {
// try {
// if (offs == 4) {
// throw new BadLocationException(str, offs);
// }
// super.insertString(offs, str, a);
// } catch (BadLocationException e) {
// Toolkit.getDefaultToolkit().beep();
// }
// }
// });
this.jPanel1.add(this.jTextField1);
this.getContentPane().add(this.jPanel1);
this.setBounds(new Rectangle(400, 400));
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}
class MyDocument extends PlainDocument {
private int length;
public MyDocument(int length) {
this.length = length;
}
@Override
public void insertString(int offs, String str, AttributeSet a) {
try {
if (offs == length) {
throw new BadLocationException(str, offs);
}
super.insertString(offs, str, a);
} catch (BadLocationException e) {
Toolkit.getDefaultToolkit().beep();
}
}
}
}
حالا دیگه می تونی بصورت داینامیک کنترلش کنی.
تازه یکه کار با حال ترم می تونی بکنه با overrideکردن همین متدود
مثلا می تونی کاری کنی که مثل صفحه یک ماشین حساب کار کنه که حروف رو فیلتر کنی.
وووو هر فرمتی که بخوای بسازی.
بایک مفهوم object oriented که همان override کردن هست و جاوا بخوبی اون رو ساپورت می کنه ببین چقدر حالت رو می تونم درست کنم تا اینکه مثل vb یا #C عقب مونده بیام یک متدود بزارم یا یک property که برام این کار رو بکنه. مقاله و تحقیق این داستانها نداره. کلاس اضافه کنی و این برنامه ها. جالب اینه که تشکر هم ازت می شه.
کارت خوبه ولی ایجارو نمی دونستی که از قابلیتهای زبان می تونی استفاده کنی.
دلیلش هم مشخصه
۱ استفاده از IDE و زدن . های مکرر
۲ مطالعه کم و آشنا نبودن به concept و مفاهیم object oriented و قابلیت زبان جاوا از جمله در مثال اول من من اومدم یک anonymous class نوشتم که سریع کار من رو راه می اندازه و نیاز به این نیست که در مثال دوم بیام از خاصیت ارثبری استفاده کنم ولی خوب دومی خیلی کاربردی تر هست.
۳ عدم جستجوی صحیح در اینترنت برای گرفتن پاسخ سوالت.
۴ بجای فهمیدن زبان و قابلیت آن ، روکرد به syntax و کد های بدرد نخور.
از دست من ناراحت نشو من فقط خواستم بهت بگم که این سوال یک بار دیگه در این فروم پرسیده شده بود و من جواب بهش دادم. ای کاش قبلا یک سرچ توی این همین فروم می زدی.
زبان جاوا قابل مقایسه با هیچ زبانی نیست در حال حاضر و من این قول رو به شما می دم که هر زبانی که می شناسید و هر چی درون اون زبان هست، بطور کلی قابلیتهای تمام زبانهای امروز مورد استفاده دنیا در جاوا هست و بهتر از اون هم هست.
موفق باشی
بابک
java_nith
دوشنبه 22 تیر 1388, 23:57 عصر
من کد java.source.ir عزیز رو خندم
و خیلی جالب بود
ولی با خوندنش چنتا ایده به نظرم رسید
که شاید انجامه این کار از تریقهی دیگه هم انجام بتونه بشه
البته من که مثل شما عزیزان به این خوبی جاوا رو بلد نیستم
ولی یه نگاهی به کد بندازید نظرتون بگید
package JTextFieldTest;
import java.awt.Font;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JTextField;
import static javax.swing.JOptionPane.*;
public class main extends JFrame implements KeyListener{
private JTextField testTXT;
main(){
init();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(250, 80);
setVisible(true);
}
public void init(){
testTXT = new JTextField();
Font a = new Font("Serif", Font.BOLD , 25 );
testTXT.setFont(a);
testTXT.addKeyListener(this);
add(testTXT);
}
public void checkTenChart(JTextField e){
String text = e.getText();
if(text.length() >= 10){
e.setText(text.substring(0,9));
showMessageDialog(null, "more than 10 character is illegal.","ERROR", ERROR_MESSAGE);
}
}
public static void main(String [] args){
new main();
}
@Override
public void keyPressed(KeyEvent e) {
checkTenChart(testTXT);
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
کره اصلی با این متد است
که هردفعه چیزی نوشته میشه کار میکنه
public void checkTenChart(JTextField e){
String text = e.getText();
if(text.length() >= 10){
e.setText(text.substring(0,9));
showMessageDialog(null, "more than 10 character is illegal.","ERROR", ERROR_MESSAGE);
}
}
java.source.ir
سه شنبه 23 تیر 1388, 13:43 عصر
من کد java.source.ir عزیز رو خندم
و خیلی جالب بود
ولی با خوندنش چنتا ایده به نظرم رسید
که شاید انجامه این کار از تریقهی دیگه هم انجام بتونه بشه
البته من که مثل شما عزیزان به این خوبی جاوا رو بلد نیستم
ولی یه نگاهی به کد بندازید نظرتون بگید
package JTextFieldTest;
import java.awt.Font;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JTextField;
import static javax.swing.JOptionPane.*;
public class main extends JFrame implements KeyListener{
private JTextField testTXT;
main(){
init();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(250, 80);
setVisible(true);
}
public void init(){
testTXT = new JTextField();
Font a = new Font("Serif", Font.BOLD , 25 );
testTXT.setFont(a);
testTXT.addKeyListener(this);
add(testTXT);
}
public void checkTenChart(JTextField e){
String text = e.getText();
if(text.length() >= 10){
e.setText(text.substring(0,9));
showMessageDialog(null, "more than 10 character is illegal.","ERROR", ERROR_MESSAGE);
}
}
public static void main(String [] args){
new main();
}
@Override
public void keyPressed(KeyEvent e) {
checkTenChart(testTXT);
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
کره اصلی با این متد است
که هردفعه چیزی نوشته میشه کار میکنه
public void checkTenChart(JTextField e){
String text = e.getText();
if(text.length() >= 10){
e.setText(text.substring(0,9));
showMessageDialog(null, "more than 10 character is illegal.","ERROR", ERROR_MESSAGE);
}
}
سلام
به نظر بنده اگر اشتباه نکنم کاری که شما انجام داده اید static است و باید مدام مقدار عدد 10 را در برنامه تغییر دهید. یعنی اگر بخواهید حداکثر تعداد کاراکتر 20 باشد، آنگاه باید به صورت دستی در متد مربوطه آن را وارد نمایید. اگر این عدد را به صورت یک پارامتر به تابع checkTenChart بفرستید کار بهتر میشود. در ضمن یک bug در برنامهتان وجود داشت، یعنی اگر کاربر 10 کاراکتر را که وارد میکرد و میخواست کلید Back را بزند آنگاه بازهم Message Box نمایش داده میشد. و بعد اجازه پاک کردن کاراکترها را برنامه میداد.(البته از java_nith عزیز معذرت خواهی مینمایم که به کدهایش ایراد گرفتم. این دوست عزیز باید این متن را به عنوان یک نظر شخصی از این حقیر در نظر بگیرند. امیدوارم کارساز باشد.).
در ضمن تکنیکی را که استفاده نمودید تکنیک خوبی است. من از این تکنیک برای فیلتر کردن استفاده کرده بودم.
در مورد بهینگی کدها و اینکه آیا اصول شیءگرایی در آن کاملا رعایت شده است بهتر است آقا بابک نظر دهد. زیرا در مقابل دانش Object Oriented ایشان دانش من صفر است.
یک سؤال هم از آقا بابک داشتم:
دوست عزیز اگر پروژه ما بیش از 20 فرم داشت که در هر فرم نیز چندین JTextField داشته باشیم آنگاه باز هم به نظر شما مقرون به صرفه است که مدام از روش شما در برنامه استفاده کنیم یا اینکه بیاییم و یک کلاس جداگانه همانطور که بنده آن را انجام دادم تعریف نماییم تا کار ما به صورت بهینه انجام شود؟ چون در این صورت مجبور هستیم در هر کلاس کدهای مربوطه را تکرار نماییم! در نتیجه در اینصورت دیگر نیازی به استفاده از متد و کلاسها نداشتیم و همه کدها را در یک کلاس و با تکنیکهای اشاره شده توسط شما میگنجاندیم؟!!!!!!!!!!!:متفکر:
لطفا از این سؤال نارحت نشوید. چون نمیدانم؛ پرسیدم، واگرنه قصد جدل و یا اینکه اصرار بر درست بودن کار خود مبنی بر اصول شیءگرایی داشته باشم، ندارم. منتظر پاسختان هستم.:چشمک:
یکی از دلایلی که این تاپیک را ایجاد کردم این بود که میخواستم ایرادهای کارم گرفته شود و اصلا میخواستم تجارب و دیدگاههای مختلف را در این رابطه بدانم. دلیل اینکه به این سایت میآیم نیز همین است. میخواهم تجارب مختلف را ببینم و اگر خوب بودند به کار بگیرم. واگرنه در این سایت قصد آموختن علم را ندارم، چون برای یادگرفتن علم همت خود انسان اولین شرط موفقیت اوست و دیگران نباید چیزی را به او دیکته کنند.
لیس للانسان الا ما سعی
آقا بابک با نظر شما در مورد اینکه جاوا بهترین است؛ موافقم، زیرا من اصلا زبانهایی را که شما نام بردهاید کار نکردهام و یک راست به سراغ جاوا آمدهام. همچنین از گوشزد شما بابت اینکه اینکار مقاله نیست متشکرم. بهتر بود عنوان آن را "گفتگو" در نظر میگرفتم، و از شما میخواهم که اینکار را رو حساب بیتجربگی بگذارید.
بهترین دوستان من کسانی هستند که عیبهایم را به من هدیه میکنند.
با تشکر
java_nith
چهارشنبه 24 تیر 1388, 01:52 صبح
منم با شما خیلی موافقم
دلیل کد گذاشتنه منم اینجا فقط غلط گیری است
مثلا الان شما که تذکر دادید من درستش کردم
نه اتفاقا که ناراحت نشدم بلکه خیلی خوشحال شدم که اصلا خندینش
به نظر من این کد شما خیلی کاری داره
هیچ مشکلی هم با کد شما نیست
فقط با خوندن اون من به یه فکره دیگه افتادم
منم جاوا اولین برنامم استش و زیاد هم بلد نیستم
چیزهای که هم گفتید کاملا درسته
برنامه یه مشکلی داره اونم اینه که بازم پاک میکنی یک بار دیگه پیغام میده
که نمیدونم چه کارش کنم
ولی در مورد اون اینکه باید عدم کد رو تغییر بده من یک کد بهتر نوشتم
که شما هرجا بخید بهش ۲تا پارامتر میدید
یکی با انتخاب JTextField و یکی هم تعداد کلمات
مرسی بازم از اینکه وقت گذشتید و کد رو نگاه کردید :=)
آریان
package JTextFieldTest;
package JTextFieldTest;
import javax.swing.JTextField;
import static javax.swing.JOptionPane.*;
public class main{
public static void checkChart(JTextField txtField, int charSize){
String text = txtField.getText();
text.trim();
if(text.length() >= charSize){
txtField.setText(text.substring(0,(charSize-1)));
showMessageDialog(null, "more than "+charSize+" character is illegal.","ERROR", ERROR_MESSAGE);
}
}
}
package JTextFieldTest;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
public class GUI extends JFrame implements KeyListener{
/**
*
*/
private static final long serialVersionUID = 1L;
private JTextField testTXT;
GUI(){
init();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(250, 80);
setVisible(true);
}
public void init(){
testTXT = new JTextField();
Font a = new Font("Serif", Font.BOLD , 25 );
testTXT.setFont(a);
testTXT.addKeyListener(this);
add(testTXT);
}
public static void main(String[] args){
new GUI();
}
@Override
public void keyPressed(KeyEvent arg0) {
main.checkChart(testTXT, 10);
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
mazdadoost
چهارشنبه 24 تیر 1388, 11:28 صبح
با سلام :
برای اضافه کردن خصوصیات جدید به یک شی (کلاس)ایده بهتر از وراثت استفاده از Decorator Pattern می باشد.(Gof95).
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.