برنامج ال Word مبسط
اقتباسوهل لهذا فائدة في أداء الشيفرة أو في كمية الذاكرة؟
لم أفهم سؤالك :wacko:
إذا كنت تعني هل لهذا تأثير في الأداء والذاكرة فلا أظن، لأن الكائن Font الأول لم تعد توجد أي reference له، وبالتالي فإن الgarbage collector سيقوم بحذفه
لماذا لم يعد يوجد أى reference له ؟؟؟
----------------------------------------------------------------
هنا معى مشكلة :
----------------------
عندما نعمل معاينة على كلمة Test or sample كما عند مستر عصام
نريد أن نجعل هذا يؤثر بدوره على مانكتبه فى ال textArea
فقررت عمل ذاك
فى الكلاس الكبير خالص TextEditor
قمت بعمل الدالة هذه و لكن الأختيارات الى اختارها لا تؤثر على الكلام الذى اكتبه فى ال textarea
فهل تلك خاطئة أم مش مضبوطة جيداً :
public void fontEffect() {
new FontClass().applayButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
area.setFont(new Font(new FontClass().selectedFontName, new FontClass().selectedFontStyle,
new FontClass().selectedFontSize));
new FontClass().setVisible(false);
}
});
}تلميحة بسيطة الهدف من أنى كتب هذا السطر
new FontClass().setVisible(false);
أقصد به عندما تختار ما تختاره من حجم و اسم و نوع الخط
اخفى ال Dilog الخاص بال font
تذكروا جيداً أن هذه الدالة فى الكلاس TextEditor ليس فى الكلاس FontClass
شكراً
تم تعديل هذه المشاركة بواسطة mr.beshoy في 26 يوليو 2009 في 15:11
يا أخي حرام عليك، مازلت تقوم بنفس الشيء رغم الذي قلته لك
new FontClass().selectedFontSize));
new FontClass().setVisible(false);
area.setFont(new Font(new FontClass().selectedFontName, new FontClass().selectedFontStyle,
هنا أيضا تنشئ أربع كائنات مستقلة عن بعضها... لماذا تقوم بهذا؟؟؟؟؟!!!!!!!!!!!!!!!!
لماذا لا تفعل
fc.setSize(...)
fc.setVisible(..)
...................
fc.selectedFontName .... fc.selectedFontStyle
FontClass fc = new FontClass();
لماذا لا تستعمل reference واحدة داخل الكلاس TextEditor بدل إنشاء كائن جديد كل مرة، وبالطبع ما ستطبقه على واحد لن ينطبق على الآخر
يعني كل الذي قيل لم تاخده بعين الإعتبار، هذا إذا كنت قرأته أصلا... لأنك تعيد نفس الأخطاء
لالالا قرأت و أقراكل كلمة تكتبها
و لكن انا نسيت القضية دى مش أكثر
و لكن الأن ثبتت الفكرة و فهمتها جدا جدا
و بقى الخط يأثر تمام فى ال TextArea
و أدى الشفيرة يا عم :
private void fontProperties(ActionEvent e) {
final FontClass fontClass = new FontClass();
if (e.getSource() == formatMenuItems[0]) {
fontClass.setSize(new Dimension(500, 400));
fontClass.setLocationRelativeTo(null);
fontClass.setVisible(true);
fontClass.setResizable(false);
}
fontClass.applayButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
area.setFont(new Font(fontClass.selectedFontName, fontClass.selectedFontStyle, fontClass.selectedFontSize));
fontClass.setVisible(false);
}
});
}و أكر ثانية أنا أقرا و أهتم بما يُكتب و لكن المضوع كان غايب عن ذهنى
لكن المرة دى فهمته أكثر جداً
شكراً و متزقش كده تانى مرة :lol:
سلام
أقصد هل هناك ما يدعو أن لا أستخدم صانع الكائنات واستخدم الدالة deriveFont??
على كل موضوع الاعتماد على gc في كل شيء قد لا يحمد عقباه
تحياتي
في كلتا الحالتين يتم إنشاء كائن Font جديد، لكن استعمال deriveFont يقوم بreplication للكائن القديم يعني له نفس الخصائص -- إسم الخط والحجم والstyle-- ومن ثم تغير الخاصية التي تريد حسب الparameter الذي تمرره للميثود
عندما راجعت الشيفرة الخاصة بهذه الفئة
وجدته يقوم بعمل استنساخ cloning للخصائص
هل صن تنصح باستخدام إحدى الطريقتين؟؟؟
شكل بيشوي هيقتلني قلبت الموضوع أسئلة :lol:
تحياتي
معلومات جيدة ....
-----------------------------
كنت فى مغامرة عنيفة هذه السهرة لا أقول على أولها لعلى أتغلب عليها هو أنا تغلبت عليها تغلب جزئى و ليس كلى
-------------------------------------------------------
و لكن فى لمشكلة دى مش قادر أسكت عليها
لأنى مش عارف فين الغلط اصلاً
و ال مكتوب سليم
بكل بساطة انا أضفت buttons جديدة
خاصة بال center , left,right,Bold,color , underline
و هكذا
الزراير ياجدعان بتظهر بس الصور مش ظاهرة عليها
هتقولى يمكن الإمتداد يمكن مش كاتب صح يمكن يمكن
هقولك ما يمكنش
مشكلة بسيطة و المشكلة انها عبيطة ياريت فيها فن
ادى يا أحبائى ال code كله اتطلعوا عليه و قولولى ايه الى بيحصل يمكن انا فقدت نظرى و لا حاجة
أستعمل deriveFont لأني حينها لست مضطرا لمعرفة إسم الخط الجاري استعماله والذي سيتم استعماله، أو خصائصه الأخرى التي سأكون مضطرا لتمريرها للconstructor إذا استعملته
بالنسبة لمشكلتك يا عاطف، فهي من الصور
استعمل صور أخرى، وضعت لك بعض الصور في المرفقات وهي تظهر بشكل جيد، بالطبع يجب تغيير الأسماء في الشيفرة لأنها صور png وليس jpg
سلام
----
أولا انظروا الصورة المرفقة
سترون الزرار الخامس حسب ترتيبه فى ال Array " A "
مختص بالخط Bold
الإضافات التى ضفتها على ال class TextEditor
Font type;
private String[] images = {"new.JPG", "open.JPG", "save.JPG", "copy.JPG", "paste.JPG", "b.jpg", "i.jpg", "u.jpg", "a.jpg", "left.jpg", "center.jpg", "right.jpg", "align.jpg"};
private String[] imageName = {"new", "open", "save", "copy", "paste", "Bold", "Italic", "underLine", "Color", "Left", "Center", "Right", "Align"};لو نظرنم بداخل الدالة actionPerformed هناك الدالة fontProperties(e)
أضفت عليها الكود المتعلق بانى عندما اضغط على الزر " A"
يجعل الخط Bold
و لكن عندما أضغط عليه يعطينى Nullpointerexception
لماذا هل انا عامل شئ خاطى فيها
نص الدالة ( السطور التى أمامها كومنت هى التى تم إضافتها )
-------
private void fontProperties(ActionEvent e) {
final FontClass fontClass = new FontClass();
if (e.getSource() == formatMenuItems[0]) {
fontClass.setSize(new Dimension(500, 400));
fontClass.setLocationRelativeTo(null);
fontClass.setVisible(true);
fontClass.setResizable(false);
}
fontClass.applayButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
area.setFont(new Font(fontClass.selectedFontName, fontClass.selectedFontStyle, fontClass.selectedFontSize));
fontClass.setVisible(false);
}
});
// if (e.getSource() == buttons[5]) {
// type=type.deriveFont(Font.BOLD);
// area.setFont(type);
// }
}شكرا و شكرا على الصور ياعصام
سلام
تم تعديل هذه المشاركة بواسطة mr.beshoy في 27 يوليو 2009 في 20:11
نقطة جيدة نوعاً ما أخ عصام
فعلاً الصور خاصتك فيها مشكلة
حاولت أن أصل إلى السبب بالضبط
لكن جافا لم تستطع تحميل الصورة من الأصل
تحياتي
ما هي type التي عندك في الكود؟؟
ثانيا الكود الذي تريده أن ينفذ عند الضغط على زر bold ليس مكانه داخل fontproperties()
تذكر هذا السطر الذي كتبته في intializeIcons()
buttons.addActionListener(this);
يعني لازم تكتب الكود في الميثود actionPerformed الموجودة في TextEditor
ولازم أيضا إزالة السطور التي كنت كاتبها
if (e.getSource() == buttons[5]) {
//type=type.deriveFont(Font.BOLD);
area.setFont(area.getFont().deriveFont(Font.BOLD));
}
/*openFileDialog(e);
saveFile(e);
copyCutPastetText(e);
undoOperation(e);
fontProperties(e);
aboutMe(e);*/
}
public void actionPerformed(ActionEvent e) {
قبل أن أجرب كلامك
الدالة fontProperties
موجودة فى ال actionPerformed
بص على الكود الكامل
يعنى كتبت فى ال actionPerformed
كتبت فى ال fontProperties
العملية واحد
----------------------------------------------------------------
type ده متغير من نوع Font
------------------------------------------------------------------
الآن جربتها :
---------------
private void fontProperties(ActionEvent e) {
final FontClass fontClass = new FontClass();
if (e.getSource() == formatMenuItems[0]) {
fontClass.setSize(new Dimension(500, 400));
fontClass.setLocationRelativeTo(null);
fontClass.setVisible(true);
fontClass.setResizable(false);
}
fontClass.applayButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
area.setFont(new Font(fontClass.selectedFontName, fontClass.selectedFontStyle, fontClass.selectedFontSize));
fontClass.setVisible(false);
}
});
if (e.getSource() == buttons[5]) {
area.setFont(area.getFont().deriveFont(Font.BOLD));
}
if (e.getSource() == buttons[6]) {
area.setFont(area.getFont().deriveFont(Font.ITALIC));
}
}المشكلة مش انى كنت واضع الكود فى ال fontproperties(e)
لالالا
المشكلة انى كنت بعمل كده :
type=type.deriveFont(Font.BOLD); area.setFont(area.getFont().deriveFont(Font.BOLD));
بس ايه العيب فى كده ؟؟
شكراً
تم تعديل هذه المشاركة بواسطة mr.beshoy في 28 يوليو 2009 في 00:33
قبل ما أجيلك لمصر، إقرا الكود اللي أنت كتبته
أولا أنت واضعه خارج الactionPerformed
تانيا الالactionPerformed الذي تتكلم عنه خاص بالزر applayButton، شوف بنفسك
fontClass.applayButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
area.setFont(new Font(fontClass.selectedFontName, fontClass.selectedFontStyle, fontClass.selectedFontSize));
fontClass.setVisible(false);
}
});//end of actionPerformed
//all this is out of the method actionPerformed
// if (e.getSource() == buttons[5]) {
// type=type.deriveFont(Font.BOLD);
// area.setFont(type);
// }
}
//this ActionListener object is specific to applyButton
ثالثا والأهم، الكود اشتغل بعد ما قمت بالتغييرات الليي نصحتك بها
رابعا وأخيرا، أنا لا أحاول أغلطك، إذا كان غلط أقول لك غلط، إذا كان صحيح أقول لك صحيح
يا أخى أنا لا أُجادل معك
أنا أُناقش فقط بهدف معرفة شئ ما
و لك الحق فى أن تُغلطنى و تقول لى خطئ :)
أنا لما كنت بقول نكتبها فى ال ActionPerformed
اقصد بما أن الدالة fontproperties موجودة فى ال actionPerofrmed
فكتابة السطور السابقة فى ال actionPerformed ذات نفسها هو نفسه لو كتبنا
فى ال fontproperties
على اية حال مشكور على المعلومة
عُدنا معكم .....
فى محاولة جعل النص يتحرك إلى اليمين أو إلى الشمال
فلجأت لهذه الطريقة و لكنها لا تعمل ...
if (e.getSource() == buttons[9]) {
area.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
}
if (e.getSource() == buttons[11]) {
area.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
}جربت استعمل بدل TextArea جعلتها TextPane
حيث توجد الدالة getParagraphAttributes()
ولكن لم أعرف كيف من خلالها احرك النص للمكتوب يميناً أو يساراً
و هناك ايضاً الدالة getStyledocument ()
ممكن تُتعمل لتحري النص لكن حاولت اجيب فيها يمين أجيب فيها شمال مش عرفت
شكراً
مازالت المشكلة قائمة
من خلال البحث تعرف على method تُسمى (
int)moveCaretPosition
فا ستعملتها كالآتى : -
public void actionPerformed(ActionEvent e) {
if(e.getSource()==buttons[0]){
// area.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
area.moveCaretPosition((int) JTextArea.RIGHT_ALIGNMENT);
}
if(e.getSource()==buttons[1]){
// area.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
area.moveCaretPosition((int)JTextArea.LEFT_ALIGNMENT);
}
if(e.getSource()==buttons[2]){
area.moveCaretPosition((int)JTextArea.CENTER_ALIGNMENT);
}
}buttons[0] >> left
buttons[1]>>right
buttons[2] >> center
مش عارف ايه السبب فى عدم عملها .... :angry:
setComponentOrientation تعمل يشكل جيد
وهذا مثال بسيط جربت به إن كانت تعمل أم لا
import java.awt.event.*;
import java.awt.*;
public class TestTextArea {
public static void main(String[] args) {
final JTextArea txt = new JTextArea();
JScrollPane scroll = new JScrollPane(txt);
JFrame frm = new JFrame();
frm.add(scroll);
JButton left = new JButton("left");
left.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
txt.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
}
});
JButton right = new JButton("right");
right.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
txt.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
}
});
frm.setSize(400, 400);
JPanel pn = new JPanel();
pn.add(right);
pn.add(left);
frm.add(pn, BorderLayout.SOUTH);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setVisible(true);
}
}
import javax.swing.*;
يا سبحان الله اشتغلت مش عارف ايه السبب
بس المشكلة أن مش عطيك خاصية انك تجل الكلام فى ال center
هل فى خاصية ليهها ممكن تكون غايبة عنى و لا لازم أكودها بنفسى
------------------------------------------
طب ايه السبب الى بيجعل هذه الطريقة غير صالحة
area.moveCaretPosition((int)JTextArea.LEFT_ALIGNMENT);
شكرا
تم تعديل هذه المشاركة بواسطة mr.beshoy في 29 يوليو 2009 في 00:30
لانها لا تستعمل بتلك الطريقة
أنت لازم تعطيها رقم
يعني مثلا تقول له روح للموقع 50، الcursor سيكون عند الحرف الخمسين
وهي لا علاقة لها باليمين واليسار
تم تعديل هذه المشاركة بواسطة herch في 29 يوليو 2009 في 00:31
ممم فهمتك
طب موضوع ال center هل له خاصية زى right_to_left
و لا لازم اعملها انا
انا مش لاقى خاصية صريحة ليها ..
لا أعلم
سأبحث قليلا وأقول لك إذا وجدت أي شيء
ما توصلت اليه لجعل ال text يتحرك للمنتصف كالآتى و لكنه محتاج تعديل :
هذه الدالة actionPerformed()
--------------------------------------------
public void actionPerformed(ActionEvent e) {
Graphics g = null;
openFileDialog(e);
saveFile(e);
copyCutPastetText(e);
undoOperation(e);
fontProperties(e);
aboutMe(e);
if (e.getSource() == buttons[5]) {
area.setFont(area.getFont().deriveFont(Font.BOLD));
}
if (e.getSource() == buttons[6]) {
area.setFont(area.getFont().deriveFont(Font.ITALIC));
}
if (e.getSource() == buttons[7]) {
AttributedString as = new AttributedString(area.getText());
as.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON,
area.getText().charAt(0), area.getText().length());
}
if (e.getSource() == buttons[9]) {
area.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
}
if (e.getSource() == buttons[10]) {
paint(g);
}
if (e.getSource() == buttons[11]) {
area.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
}
}الذى أُضيف اليها :
Graphics g=null;
و الaction على button[10]>> centertt
if (e.getSource() == buttons[10]) {
paint(g);
}نرى أنه بيعمل calling للدالة paint و تلك التى بواسطتها نحرك النص
نص الدالة :
----------
@Override
public void paint(Graphics g) {
int textHeight = area.getHeight();
int textWidth = area.getWidth();
int x = textWidth / 2;
int y = textHeight / 2;
g.drawString(area.getText(), x, y);
}أعلم أن بها خلل و لكن هذا ما توصلت له
و جارية المحاولات ....بس ياريت لو توصلت يا أخ عصام أو أى من الزملاء الأفاضل يفيدنا
شكراً
تم تعديل هذه المشاركة بواسطة mr.beshoy في 29 يوليو 2009 في 01:05
يبدو أنه لا توجد طريقة لفعل مل تريد بJTextArea
إستعمل مكانها JTextPane، وهذا مثال يستخدم JTextPane ويتيح لك وضع النص في اليمين واليسار والوسط
import java.awt.event.*;
import java.awt.*;
import javax.swing.text.*;
public class TestJTextPane {
public static void main(String[] args) {
final JTextPane txt = new JTextPane();
JScrollPane scroll = new JScrollPane(txt);
JFrame frm = new JFrame();
frm.add(scroll);
JButton left = new JButton("left");
left.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
StyleConstants.setAlignment(txt.getLogicalStyle(), StyleConstants.ALIGN_LEFT);
txt.requestFocusInWindow();
}
});
JButton right = new JButton("right");
right.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
StyleConstants.setAlignment(txt.getLogicalStyle(), StyleConstants.ALIGN_RIGHT);
txt.requestFocusInWindow();
}
});
JButton center = new JButton("center");
center.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
StyleConstants.setAlignment(txt.getLogicalStyle(), StyleConstants.ALIGN_CENTER);
txt.requestFocusInWindow();
}
});
frm.setSize(400, 400);
JPanel pn = new JPanel();
pn.add(left);
pn.add(center);
pn.add(right);
frm.add(pn, BorderLayout.SOUTH);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setVisible(true);
}
}
import javax.swing.*;
