الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف اصمم جدول يحتوي على Components مختلفة ؟؟

بدأه MKSoft في 26 سبتمبر 2009 · 8 رد · 1,328 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اخواني عندي سؤال بسيط ان شاء الله .

كيف يمكنني تصممي جدول تفاغلي أو Complex table

أي جدول يحتوي على JComboBox , JButtons , JTextFields , ... etc

هل ممكن اعطاء مثال بسيط

#2

هناك أمران يجب معالجتهما

الأمر الأول، هو أنه عندما تضيف مكونا ما، فإنه يتم النداء على الدالة getTableCellRendererComponent الموجودة في TableCellRenderer، هذه الدالة تعيد كائنا يرث من Component، وهذا الكائن يكون عادة من صنف JLabel، حيث يتم النداء على toString() الخاصة بالكائن الذي أضفته إلى الجدول وكتابة الString الناتج في الJLabel، ثم تقوم getTableCellRendererComponent بإعادة الJLabel الناتج إلى الجدول ليتم رسمه

إذن إذا قمت بإضافة كائن JButton فإن ما سيتم رسمه ليس الزر نفسه، ولكن فقط الString الناتج عن النداء على toString. لذلك يجب كتابة فئة جديدة ترث من TableCellRenderer ونقوم بإعادة كتابة الدالة getTableCellRendererComponent

الأمر الثاني ، كل الevents يتم التعامل معها من طرف الJTable، يعني لو ضغطت على JButton داخل JTable، فالevent لن يذهب إلى الزر بل إلى الجدول، لذلك يجب عند كل event إعادة إرساله إلى الزر أو أي مكون آخر

هذا مثال


import javax.swing.event.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;

public class CustomJTable
{
JButton btn1 = new JButton("Button1");
JButton btn2 = new JButton("Button2");
JButton btn3 = new JButton("Button3");
JCheckBox chk1 = new JCheckBox();
JCheckBox chk2 = new JCheckBox();
JCheckBox chk3 = new JCheckBox();
JTable table;

public CustomJTable() {

MouseListener mListener = new MouseAdapter() {
public void mousePressed(MouseEvent me) {
if (me.getSource() == btn1) {
System.out.println("Button1 pressed");
} else if (me.getSource() == btn2) {
System.out.println("Button2 pressed");
} else if (me.getSource() == btn3) {
System.out.println("Button3 pressed");
} else if (me.getSource() == chk1) {
chk1.setSelected(!chk1.isSelected());
} else if (me.getSource() == chk2) {
chk2.setSelected(!chk2.isSelected());
} else if (me.getSource() == chk3) {
chk3.setSelected(!chk3.isSelected());
}
}
};
btn1.addMouseListener(mListener);
btn2.addMouseListener(mListener);
btn3.addMouseListener(mListener);
chk1.addMouseListener(mListener);
chk2.addMouseListener(mListener);
chk3.addMouseListener(mListener);

Object rows[][] = {{btn1, chk1}, {btn2, chk2}, {btn3, chk3}}; Object cols[] = {"Column1", "Column2"};
table = new JTable(rows, cols);
table.addMouseListener(new MyTableListener());
MyCellRenderer renderer = new MyCellRenderer();
table.setDefaultRenderer(Object.class, renderer);

JFrame frm = new JFrame();
frm.add(new JScrollPane(table));
frm.setSize(200, 200);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setVisible(true);
}

public static void main(String args[]) {
new CustomJTable();
}

class MyTableListener implements MouseListener {

private void processEvent(MouseEvent me) {
int row = table.rowAtPoint(me.getPoint());
int column = table.columnAtPoint(me.getPoint());
if (row < table.getRowCount() && row >= 0 && column < table.getColumnCount() && column >= 0) {
Object o = table.getValueAt(row, column);
if (o instanceof JButton) {
JButton btn = (JButton)o;
MouseEvent e = SwingUtilities.convertMouseEvent(table, me, btn);
btn.dispatchEvent(e);
table.repaint();
} else if (o instanceof JCheckBox) {
JCheckBox chk = (JCheckBox)o;
MouseEvent e = SwingUtilities.convertMouseEvent(table, me, chk);
chk.dispatchEvent(e);
table.repaint();
}
}
}
public void mousePressed(MouseEvent me) { processEvent(me); }
public void mouseReleased(MouseEvent me) { processEvent(me); }
public void mouseEntered(MouseEvent me) { processEvent(me); }
public void mouseExited(MouseEvent me) { processEvent(me); }
public void mouseClicked(MouseEvent me) { processEvent(me); }
}
}
class MyCellRenderer implements TableCellRenderer {

public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row, int column)
{
if (value instanceof Component) {
return (Component)value;
} else {
return new JLabel(value.toString());
}
}
}
import javax.swing.*;

تعبت من الكتابة ، الشرح بعد الفاصل :P

تم تعديل هذه المشاركة بواسطة herch في 26 سبتمبر 2009 في 21:52

#3

يعني كيف تريد الأزرار في الجدول

كان عندي مشروع إشتغلت عليه بالجافا وكنت أريد أريد الزر في الجدول ولم أجد أي طريقة أن أضع زر في خلية من الجدول بل كل المحاولات التي حاولتها كانت تعطيني إما زر في عمود بأكمله او في صف بأكلمه يمكنك أن تأخذ هذا المثال من موقع الشركة

http://java.sun.com/docs/books/tutorial/ui...ents/table.html

تم تعديل هذه المشاركة بواسطة bilal2005 في 26 سبتمبر 2009 في 22:02

#4

الآن مع الشرح المختصر :D

أولا بالنسبة للكلاس المسؤولة عن رسم عناصر الجدول، داخل الدالة getTableCellRendererComponent نتحقق من أن الكائن الذي نريد إضافته هو من فئة Component أو من فئة ترث منه، إذا كان الأمر كذلك فإننا نعيده كما هو، إذا لم يكن كذلك ننادي على الدالة toString ونكتب ناتجها داخل JLabel، ثم نعيد هذا الJlabel

بالنسبة للevents، فيجب أن نمررها من الجدول إلى المكونات التي داخل الجدول، لذلك سنستخدم dispatchEvent التي تمرره من مكون إلى آخر.

داخل الدالة processEvent، أولا نسترجع رقم السطر ورقم العمود من خلال rowAtPoint و columnAtPoint، لأننا من خلال الMouseEvent نتوفر فقط على الإحداثيات التي تم النقر فيها بالفأرة

ثم نتحقق إذا كان رقما السطر والعمود يوجدان داخل الجدول، ثم نقوم بتمرير الevent

#5

شكرا يا عصام وبلال على المشاركة ,,,

أريد أن أسال يا عصام ,, لقد لاحظت في المثال أن الزر Button , لا يمتلك خاصيته التفاعلية , هي الضغط , فضلا عن ذلك أنك إذا قمت بالضغط Double click عليه فإنه يظهر على شكل String , فما الحل لكلا الحالتين.

#6

كل عمود في الجدول يكون مرتبط بTableCellEditor وهو الذي يقوم بإظهار الtext field فوق الزر عند double click

حاولت حل الأمر بكتابة TableCellEditor يقوم فقط برسم المكون نفسه، أي الزر، بدل الtext field، لكن لا أعلم إذا كان هذا أفضل حل


colModel.getColumn(0).setCellEditor(new TableCellEditor() {
public Component getTableCellEditorComponent(JTable table,
Object value,
boolean isSelected,
int row,
int column) {
return (Component)table.getValueAt(row, column);
}
public boolean isCellEditable(java.util.EventObject anEvent) { return false; }
public void addCellEditorListener(CellEditorListener l) { }
public void removeCellEditorListener(CellEditorListener l) { }
public void cancelCellEditing() { }
public boolean stopCellEditing() {return true; }
public boolean shouldSelectCell(java.util.EventObject anEvent) { return false; }
public Object getCellEditorValue() { return null; }
});
		 TableColumnModel colModel = table.getColumnModel();

بالنسبة للمشكل الأول حاولت معه لكن لا فائدة :angry:

#7

للأغراض الخاصة جداً

قم بإنشاء الجدول الخاص بك

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#9

السلام عليكــم ورحمـة الله وبركاتــه

هذا الكود يعطي نتيجة احسن من الكود السابق

فهل من احد يستطيع ان يشرحه تفصيلياً


import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableButton3 extends JFrame
{
public TableButton3()
{
String[] columnNames = {"Date", "String", "Integer", "Decimal", ""};
Object[][] data =
{
{new Date(), "A", new Integer(1), new Double(5.1), "Delete0"},
{new Date(), "B", new Integer(2), new Double(6.2), "Delete1"},
{new Date(), "C", new Integer(3), new Double(7.3), "Delete2"},
{new Date(), "D", new Integer(4), new Double(8.4), "Delete3"}
};

DefaultTableModel model = new DefaultTableModel(data, columnNames);
JTable table = new JTable( model )
{
// Returning the Class of each column will allow different
// renderers to be used based on Class
public Class getColumnClass(int column)
{
return getValueAt(0, column).getClass();
}
};

JScrollPane scrollPane = new JScrollPane( table );
getContentPane().add( scrollPane );

// Create button column
ButtonColumn buttonColumn = new ButtonColumn(table, 4);
}

public static void main(String[] args)
{
TableButton3 frame = new TableButton3();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setVisible(true);
}

class ButtonColumn extends AbstractCellEditor
implements TableCellRenderer, TableCellEditor, ActionListener
{
JTable table;
JButton renderButton;
JButton editButton;
String text;

public ButtonColumn(JTable table, int column)
{
super();
this.table = table;
renderButton = new JButton();

editButton = new JButton();
editButton.setFocusPainted( false );
editButton.addActionListener( this );

TableColumnModel columnModel = table.getColumnModel();
columnModel.getColumn(column).setCellRenderer( this );
columnModel.getColumn(column).setCellEditor( this );
}

public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
if (hasFocus)
{
renderButton.setForeground(table.getForeground());
renderButton.setBackground(UIManager.getColor("Button.background"));
}
else if (isSelected)
{
renderButton.setForeground(table.getSelectionForeground());
renderButton.setBackground(table.getSelectionBackground());
}
else
{
renderButton.setForeground(table.getForeground());
renderButton.setBackground(UIManager.getColor("Button.background"));
}

renderButton.setText( (value == null) ? "" : value.toString() );
return renderButton;
}

public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column)
{
text = (value == null) ? "" : value.toString();
editButton.setText( text );
return editButton;
}

public Object getCellEditorValue()
{
return text;
}

public void actionPerformed(ActionEvent e)
{
fireEditingStopped();
System.out.println( e.getActionCommand() + " : " + table.getSelectedRow());
}
}
}
 import java.awt.*;

مواضيع مشابهة