المشلكة في JTable أنك لا تستطيع أن تتحكم بها
فلا تستطيع كتابة ما تشاء فيه
جرب الشيفرة التي وضعتها لك
ستعرف ما الذي أتكلم عنه
تحياتي
المشلكة في JTable أنك لا تستطيع أن تتحكم بها
فلا تستطيع كتابة ما تشاء فيه
جرب الشيفرة التي وضعتها لك
ستعرف ما الذي أتكلم عنه
تحياتي
جربتها حقاً و لا أستطيع الكتابة على الإطلاق .... فما سبب هذا ؟؟
لما مش هنستعمل ال JTable
نستعمل ايه طيب ؟؟؟؟
قول لنا فكرتك ...
شكرا
يا جماعة أنا الى توصلت له اننا نستعمل ال HTmlEditorKit
فى مثل هذا الأمر
و لكن الأفكار ملغبطة معايا
ياريت تساعدونى فيها
و هذا اللينك المتعلق بال HtmlEditorKit
http://coding.derkeiler.com/Archive/Java/c...5/msg00104.html
مثال
import javax.swing.*;
تم تعديل هذه المشاركة بواسطة herch في 5 أغسطس 2009 في 22:41
انت فى الكود باضيف ال string
لل EditorPane
فلا يظهر شكل ال table
فما الحل ؟؟؟
اعتقد يجب استعممل HtmlEditorKit
حاولت استعملها لكن لم أفلح إلى الآن
فكيف
؟؟؟
شكرا
هذا المثال السابق مع بعض التعديلات
وهذه صورة البرنامج والجدول يظهر بشكل جيد

import javax.swing.*;
أنا من وجهة نظري , هي استخدام JTextPane أو EditorPane , بحيث يتم رسم الجدول باستخدام أدوات الرسم , ليس إضافة JTable أو حتى استخدام HtmlEditorKit , كما يفعل الإخوة , لانه ليست هذه الطريقة العملية ,, لكن أيضا عملية رسم الجدول تتطلب الكثير من الأمور التي يجب انجازها لياحكي الجدول الذي يتم إدراجه في برنامج MS-WORD .
كود بسيط يوضح طريقة رسم الجدول داخل JTextPane :
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JTextPane;
public class drawing extends JTextPane{
int r,c;
boolean canDraw = false;
public drawing(){
setBackground(Color.WHITE);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
if( canDraw ){
g.drawRect(30, 30, 400, 200);
int yDist = 200 / r;
int xDist = 400 / c;
System.out.println(yDist);
System.out.println(xDist);
for(int i = 1; i < r; i++)
g.drawLine(30, 30+(yDist*i), 430, 30+(yDist*i));
for(int i = 1; i < c; i++)
g.drawLine(30+(xDist*i), 30, 30+(xDist*i), 230);
}
}
public void drawTable(int r, int c){
this.r = r;
this.c = c;
}
}-------------------------------------------------------------------------------------------
public class TableDrawer extends javax.swing.JFrame {
drawing dr;
public TableDrawer() {
dr = new drawing();
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jSpinner1 = new javax.swing.JSpinner();
jSpinner2 = new javax.swing.JSpinner();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jPanel1.setLayout(new java.awt.BorderLayout());
jPanel1.add(dr);
jSpinner1.setValue(1);
jSpinner2.setValue(1);
jLabel1.setText("Rows");
jLabel2.setText("Columns");
jButton1.setText("Draw Table");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 517, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addGap(9, 9, 9)
.addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jSpinner2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jButton1)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel1)
.addComponent(jLabel2)
.addComponent(jSpinner2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jButton1))
.addGap(18, 18, 18)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 334, Short.MAX_VALUE)
.addContainerGap())
);
pack();
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
int rows = (Integer)jSpinner1.getValue();
int columns = (Integer)jSpinner2.getValue();
if( rows != 0 && columns != 0 ){
dr.drawTable(rows, columns);
dr.canDraw = true;
dr.repaint();
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new TableDrawer().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JPanel jPanel1;
private javax.swing.JSpinner jSpinner1;
private javax.swing.JSpinner jSpinner2;
// End of variables declaration
}المشكل في كيفية إضافة النص، وتغيير خصائصه، لأن رسم الجدول بحد ذاته سهل، لكن لكتابة النص فضروري من استعمال أحد مكونات swing النصية، سواء JTextArea أو JTextPane أو JEditorPane، لأنها مثالية ومخصصة لهذا الغرض حسب وجهة نظري
تم تعديل هذه المشاركة بواسطة herch في 6 أغسطس 2009 في 00:26
أعتقد أفضل طريقة ممكنة لهذه العملية
هي استخدام JPanel موضوع عليها JTextField بعدد الخلايا لهذا الجدول
بهذا نضمن أكبر تحكمية ممكنة
ما رأيكم؟؟؟؟
تحياتي
سوف نعود حالاً لمناقشة فكرة محمد و علاء ولكن فى مشكلة هنا نحلها فى الأول :
بالنسبة لل font بأنواعه كنا أيان ال JTextPane
نفعل هذا :
if (e.getSource() == buttons[6]) {
area.setFont(area.getFont().deriveFont(Font.ITALIC));
}عاوزين نعدلها طبقاً لل JEditorPane
أنا قولت نفعل ذلك :
if (e.getSource() == buttons[6]) {
// area.setFont(area.getFont().deriveFont(Font.ITALIC));
editorPane.setEditorKit(HTMLEditorKit.ITALIC_ACTION.toString());
}و لكن كما ترون أنها خطأ
فكرت فى ذاك( السطر الأخير ) :
if (e.getSource() == buttons[6]) {
// area.setFont(area.getFont().deriveFont(Font.ITALIC));
// editorPane.setEditorKit(HTMLEditorKit.ITALIC_ACTION.toString());
editorPane.setFont(Integer.parseInt(HTMLEditorKit.BOLD_ACTION));
}و لكن خطأ أيضاً
ما الصحيح ؟؟ :lol:
JButton bold = new JButton(new HTMLEditorKit.BoldAction());
هذا كان في المثال السابق
يا جماعة أعتقد أن الاعتماد على لغة HTML سيكون خيار سيء جداً
لأننا سنكون محدودين بإمكانية هذه اللغة
تحياتي
يا عصام الطريقة الى انت عاملها دى مش هتعمل اكشن على الbutton
أنك لما تتضغط يحصل ما تريده
يعنى عاوز تقول فى جملة ال if هذه :
if (e.getSource() == buttons[6])
نكتب بداخلها
button[6]=new JButton(new HTMLEditorKit.ItalicAction())
ما أحنا عملنا intialization قبل كده هنعمله تانى؟؟!!!
غير كده انت كده مش ضايف تاثير الزرار على النص المكتوب فى ال editorPane
معلش استحمل اسئلتى يا عصام
-----------------------------
يا علاء ادينا بنجرب و هنعدل و هنعمل كل ما يخطر ببالنا - لا :lol:تقلق
استحملنى بردو
شكراً
تم تعديل هذه المشاركة بواسطة mr.beshoy في 6 أغسطس 2009 في 17:04
هل قرأت وجربت أولا المثال الذي وضعته في الأعلى؟؟
لا داعي أصلا لعمل if، يكفي أن تحدد الAction الذي تريده عند الinitialisation للزر والHTMLEditorKit هو يقوم بالباقي
يعني غير الinitialisation الخاص بالأزرار وأزل الif الخاص بأزرار الalignment و الbold & italic & underline
على كده أحذف ال ActionListener
من على ال Buttons
???
نعم، لأنك أصلا ستمرر لهم كلاس يرث من ActionListener
لو كنت قرأت توثيق الكلاس BoldAction و ItalicAction و UnderlineAction و AlignmentAction لوجدتها تقوم بimplement للinterface ActionListener
شوف ياعم :
أنا شايف انك بتعمل هيك
new HtmlEditorKit().BoldAction();
انا مش لاقى الدالة هذه
و أدى مثال بسيط
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.text.html.HTMLEditorKit;
public class HtmlButtonTest extends JFrame {
private JEditorPane editorPane;
private JScrollPane scrollPane;
private HTMLEditorKit editorKit;
private JButton boldBotton;
public HtmlButtonTest() {
editorKit=new HTMLEditorKit();
editorPane=new JEditorPane();
editorPane.setEditorKit(editorKit);
scrollPane=new JScrollPane(editorPane);
boldBotton=new JButton(HTMLEditorKit.BOLD_ACTION);
getContentPane().add(boldBotton,BorderLayout.NORTH);
getContentPane().add(scrollPane,BorderLayout.CENTER);
}
public static void main(String[] args) {
HtmlButtonTest fram = new HtmlButtonTest();
fram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fram.setSize(600, 300);
fram.setLocationRelativeTo(null);
fram.setVisible(true);
}
}هتلاحظ انه
new HtmlEditorKit().Bold_action;
ده String
ايه المشكلة عندى
؟
تم تعديل هذه المشاركة بواسطة mr.beshoy في 6 أغسطس 2009 في 17:53
يا أخي من فضلك إقرأ ردودي جيدا، وإقرا المثال الكامل الذي أعطيته سابقا
أنا في المثال إستعملت
new HTMLEditorKit.BoldAction()
وليس
new HTMLEditorKit().BoldAction()
شفت الفرق
BoldAction هي كلاس داخل الكلاس HTMLEditorKit، يعني inner class، وليس دالة، ولم أكن أيضا أقصد BOLD_ACTION الذي هو String
الصراحة أن مش عارف ايه التوهان الى انا فيه ده ....أخباك صحتك ايه لغاية دلووقتى ؟؟؟
لم يحدث لك شئ منى ؟؟؟ :lol:
استحمل و خد نفس طويل لسة الباقى أطول من الى راح ههههههههه
طب سوال بسيط أزاى هنا الخط بيفعل تأثيرة على طول
من غير حتى ما بنعمل editorPane.setText(new Font() )
ده الى أنا مستغربله
شكرا لتعبك يا عم عصام
سلام
لأن كل تلك الكلاسات ترث من AbstractAction التي هي بدورها تقوم بimplement لActionListener وتقوم بإعادة كتابة الميثود actionPerformed
وهذه الكلاس حينما تمررها لJButton فإنك كلما ضغطت على الزر يقوم بتنفيذ الكود الذي بداخل الميثود actionPerformed
وبالطبع الكود الموجود داخل الميثود يختلف من كلاس لأخرى، فالذي يوجد داخل BoldAction ليس نفس الكود الموجود في ItalicAction
اسمحلى اعرض بعض من أفكارى العبيطة شوية :lol:
حضرتك أنا مش هقعد أكتب السطر ده
boldBotton=new JButton(new HTMLEditorKit.BoldAction());
لكذا زرار
فقررنا نعمل مصفوفات باسمهم و مصفوفة من HtmlEditorKit
كما ترى هنا
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.text.html.HTMLEditorKit;
public class HtmlButtonTest extends JFrame {
private JEditorPane editorPane;
private JScrollPane scrollPane;
// private HTMLEditorKit[] hTMLEditorKits={HTMLEditorKit.BoldAction(),HTMLEditorKit.ItalicAction(),HTMLEditorKit};
private HTMLEditorKit editorKit;
private String[]buttonsName={"bold","italic"};
private JButton[]buttons;
public HtmlButtonTest() {
editorKit=new HTMLEditorKit();
editorPane=new JEditorPane();
editorPane.setEditorKit(editorKit);
scrollPane=new JScrollPane(editorPane);
buttons=new JButton[buttons.length];
for(int i=0;i<buttonsName.length;++i){
buttons=new JButton(buttonsName);
// buttons=new JButton(hTMLEditorKits);
}
}
public static void main(String[] args) {
HtmlButtonTest fram = new HtmlButtonTest();
fram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fram.setSize(600, 300);
fram.setLocationRelativeTo(null);
fram.setVisible(true);
}
}طبعاً الى أمامه comment
هو السطر التالف
شكرا
أولا وضع الأزرار في مصفوفة سيصعب الأمر بالنسبة للذي يريد قراءة الكود الذي كتبته، لأنه لما يجد buttons[1] مثلا، كيف سيعرف لم يصلح هذا الزر؟
أنا أفضل أن تكتب كل زر باسمه، وتعطيهم أسماء معبرة، مثلا btnBold, btnItalic ...
ثانيا، هذا السطر غلط
private HTMLEditorKit[] hTMLEditorKits={HTMLEditorKit.BoldAction(),HTMLEditorKit.ItalicAction(),HTMLEditorKit};لأنك تنشئ مصفوفة من صنف HTMLEditorKit، بينما BoldAction & ItalicAction & UnderlineAction & ****Action ليست من هذا الصنف، بل كل واحدة هي كلاس بحد ذاتها، يعني صنف مستقل، إذا كنت تريد أن تجمعهم في مصفوفة، فيجب أن تكون من صنف هم كلهم يرثون منه، وبالتالي يمكن تستعمل AbstractAction وهو نفس الصنف الصنف الذي ينتظره الconstructor الخاص بJButton، يعني
private AbstractAction[] actions = {new HTMLEditorKit.BoldAction(), new *******}ولكني أفضل أن تضع لكل JButton متغير خاص به دون استعمال مصفوفة
تم تعديل هذه المشاركة بواسطة herch في 6 أغسطس 2009 في 19:04
شوف يا عم
عندك كده :
private String[] imageName = {"new", "open", "save", "copy", "paste", "Bold", "Italic", "underLine", "Color", "Left", "Center", "Right", "Align"};
private AbstractAction[] action = {new HTMLEditorKit.BoldAction(),
new HTMLEditorKit.ItalicAction(),
new HTMLEditorKit.UnderlineAction()};فى الدالة هذه كنا بواسطتها بنضع ال buttons على ال bar
و بنعمل action على الbuttons
لغينا الأكشن و وضعنا ال Loop كما سترى
بيعطينى :
Exception in thread "main" java.lang.NumberFormatException: For input string: "Bold"
private void intializeIcons() {
barIcon = new JMenuBar();
buttons = new JButton[images.length];
imagicons = new ImageIcon[images.length];
for (int i = 0; i < images.length; ++i) {
imagicons = new ImageIcon(getClass().getResource(images));
buttons = new JButton();
buttons.setIcon(imagicons);
buttons.setToolTipText(imageName);
// buttons.addActionListener(this);
barIcon.add(buttons);
}
for (int i = Integer.parseInt(imageName[5]); i < Integer.parseInt(imageName[8]); ++i) {
buttons = new JButton(action);
}
getContentPane().add(barIcon, BorderLayout.NORTH);
}الحلقة التكرارية مخصصة ل 3 button فقط هما ال bold -italic-underline أرقامهم فى المصفوفة 5-6-7
شكراً
تم تعديل هذه المشاركة بواسطة mr.beshoy في 6 أغسطس 2009 في 20:35
ممكن تشرح ماذا يعني هذا السطر
Integer.parseInt(imageName[5])
مع العلم أن imageName[5] = bold و Integer.parseInt يفترض أن تقوم بتحويل String يحتوي على عدد إلى int
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…