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

مساعدة في كود إضافة checkbox ل jTable

بدأه hossamnew في 14 فبراير 2010 · 6 رد · 1,299 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كنت أريد أن أقوم بإضافة عمود في jTable يكون بة checkbox

مثل الصورة المرفقة

فأرجو من زوي الخبرات الإفادة ولكم مني كل الإحترام والتقدير

post-206429-1266171859811_thumb.png

#2

عندما تحدد صنف عمود في Boolean، فإنه يتم تلقائيا رسمه عى شكل JCheckBox

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TableCheckBox {

	public static void main(String[] args) {
		//############################################
		DefaultTableModel model = new DefaultTableModel(new String[]{"Name", "Married"}, 0) {

			@Override
			public Class<?> getColumnClass(int columnIndex) {
				if (columnIndex == 1) {		//If it is the second column
					return Boolean.class;
				} else {
					return Object.class;
				}
			}
		};
		model.addRow(new Object[]{"zozo", true});
		model.addRow(new Object[]{"zizi", false});
		JTable table = new JTable(model);
		//############################################

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

post-181903-12661783470149_thumb.png

2
#3
herch كتب:

عندما تحدد صنف عمود في Boolean، فإنه يتم تلقائيا رسمه عى شكل JCheckBox

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TableCheckBox {

	public static void main(String[] args) {
		//############################################
		DefaultTableModel model = new DefaultTableModel(new String[]{"Name", "Married"}, 0) {

			@Override
			public Class<?> getColumnClass(int columnIndex) {
				if (columnIndex == 1) {		//If it is the second column
					return Boolean.class;
				} else {
					return Object.class;
				}
			}
		};
		model.addRow(new Object[]{"zozo", true});
		model.addRow(new Object[]{"zizi", false});
		JTable table = new JTable(model);
		//############################################

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

post-181903-12661783470149_thumb.png

شكراً لك أخي الكريم علي سرعة الإستجابة والرد

لقد قمت بفعل ذلك من قبل لكن يظهر لي كلمتي TRUE & FALSE لكن لا يظهر لي Checkbox

فأرجو منك شرح الكود المسؤل عن عرض checkbox وليس القيم النصية كما هي

#4
hossamnew كتب:

لقد قمت بفعل ذلك من قبل لكن يظهر لي كلمتي TRUE & FALSE لكن لا يظهر لي Checkbox

الصورة الموجودة في الرد هي نتيجة تشغيل الكود، لذلك فالكود يعمل المطلوب منه.

ضع الكود الذي كتبته.

--------------------

يجب أن تنشئ DefaultTableModel جديد واعمل override للطريقة getColumnClass بحيث تعيد Boolean.class بالنسبة للعمود الذي تريد رسم checkbox فيه.

ولا تنس تمرير ال model الذي أنشأت إلى الجدول JTable

.

تم تعديل هذه المشاركة بواسطة herch في 15 فبراير 2010 في 18:18

#5

يتكون كل عمود من JTable من عنصرين هما : Renderer للعرض و Editor لأدخال البيانات , ال Editor يمكنه ان يأخذ عدة اشكال التى من ضمنها JCheckBox و الذى يقوم بأعادة Boolean

الاوبجكت و ليس ال primitive , و كذلك ال Renderer يمكنك عرضه بالشكل المطلوب

اولا : ال Editor

قم بعمل Object من JChectBox و قم بوضع جميع الخصائص التي تريدها ان تظهر عند عملية ال Editing مثل ال HorizontalAlignment ال Background

ثم مرر هذا ال CheckBox الى DefaultCellEditor كالتالي :

DefaultCellEditor dct = new DefaultCellEditor(YorCheckBox);

و لوضع هذا ال Editor للعمود المطلوب ( هنا تم وضع الEditor للعمود الاول )

table.getColumnModel().getColumn(0).setCellEditor(dtc);

وبهذا تم عمل ال Editor المطلوب و في حالة قام المستخدم بوضع علامة صح فبذلك يعيد الاوبجكت Boolean و في هذه الحالة الاوبجكت Boolean بالقيمة true و العكس صحيح

ثانيا ال Renderer

قم بعمل class ترس من JCheckBox و تقوم بعمل implements لل TableCellRenderer

و قم بوضع الخصائص المرادة فيه

TableCellRenderer هيا Interface تحتوي على method واحدة لأعادة ال Component الخاص بالعرض و هي public Component getTableCellRendererComponent

قم بعمل override لها بحيث تعرض صح JCheckBox ذو علامة صح في حالة القيمة true القادمة من الBoolean الممرر من ال Editor و العكس

كود الكلاس:

    class CheckSameh extends JCheckBox implements TableCellRenderer
    {
        public CheckSameh()
        {
            setBackground(Color.WHITE);
            setHorizontalAlignment(CENTER);
        }

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected
                , boolean hasFocus, int row, int column) {
            setSelected(((Boolean)value).booleanValue());
            return this;
        }
    }

هنا تم عمل cast لل Object الذي تم تمريره من ال Editor ال ل Boolean و تم تحديد علامة ال JCheckBox من خلال ال method getBoolaenValue الموجودة في الكلاس Boolean ثم اعدنا

ال CheckBox

بعد ذلك ممر هذا ال Renderer لل العمود المطلوب (العمود الاول )

table.getColumnModel().getColumn(0).setCellRenderer(new CheckSameh());

تم تعديل هذه المشاركة بواسطة sameh mahmoud في 15 فبراير 2010 في 22:07

سبـــــحــــان الله و بحمده سبحان الله العظيم

403100468.gif

#6

شكرأ جزيلاً لكم أخوتي علي الإفادة لقد عملت الأكواد بشكل سليم

لكني عند عمل إختبار هل هناك علامة علي الصف أم لا بهذا الكود

if (dtm.getValueAt(i, 0) == Boolean.TRUE)

يحدث خطأ في الـ Loop ولا تكمل

وشكراً لكم مرة أخري

#7
Boolean b = (Boolean)dtm.getValueAt(x , 0);
boolean b2 = b.getBooleanValue();
if(b2)
{

}

جرب و قولي

سبـــــحــــان الله و بحمده سبحان الله العظيم

403100468.gif

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