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

jtable cell editing

مغلقمُجاب
بدأه Zaid Sultan في 31 أكتوبر 2013 · 5 رد · 1,024 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

 

تحياتي للجميع 

 

لو سمحتم أريد مساعدة في لغة الجافا وتحديداً في موضوع JTable

حيث أنني أستخدم JTable وأريد عندما أقوم بتعديل محتوى Cell معين أن يتغير محتوى ال Cell الى المدخل الجديد.

حيث أنني في الوقت الحالي .. إذا أردت على أن أعدل على Cell تحتوى على كتابة .. فإنني أضطر لمحو الكتابة ومن ثم كتابة شيئ جديد .. أريد أن أختصر عملية محو الكتابة الحالية واستبدالها بالجديدة فور كتابتي.

 

شكراً لكم مقدماً

#2

السلام عليكم

 

 

تنبيه : في المرات القادمة عليك بوضع محاولتك قبل طلب الحل.

 

 

قم بإنشاء كلاس يقوم بعمل implements لـ TableModelListener هكذا :

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

public class TableModelListenerDemo {

    Object rowData[][] = {{"1", "one", "I"}, {"2", "two", "II"}, {"3", "three", "III"}};
    String columnNames[] = {"#", "English", "Roman"};

    public TableModelListenerDemo() {
        JTable table = new JTable(rowData, columnNames);
        JScrollPane scrollPane = new JScrollPane(table);
        table.getModel().addTableModelListener(new TableModelListener() {

            @Override
            public void tableChanged(TableModelEvent e) {
                int row = e.getFirstRow();
                int column = e.getColumn();
                MyModel model = new MyModel(rowData, columnNames);
                Object data = model.getValueAt(row, column);
                model.setValueAt(row, column, data);
                System.out.println("value changed : " + data.toString() + " -- in row : "
                        + (row + 1) + ", column : " + (column + 1));
            }
        });

        JFrame frame = new JFrame("Table Model Listener Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.setSize(300, 150);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

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

و الكلاس الخاص بالـ Model يكون هكذا مثلا :

import javax.swing.table.AbstractTableModel;

public class MyModel extends AbstractTableModel {

    private Object[][] data;
    private String[] title;

    public MyModel(Object[][] donnees, String[] titres) {
        this.data = donnees;
        this.title = titres;
        this.fireTableDataChanged();
    }

    @Override
    public int getColumnCount() {
        return this.title.length;
    }

    @Override
    public int getRowCount() {
        return this.data.length;
    }

    @Override
    public Object getValueAt(int row, int col) {
        return this.data[row][col];
    }

    public void setValueAt(int row, int col, Object newValue) {
        data[row][col] = newValue;
        fireTableCellUpdated(row, col);
    }
}

بالتوفيق.

#3

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

شكراً لك أخي .. ولكني لم أستطع من تغيير النص داخل cell الا بعد حذف النص الموجود .. ما أريده هو إمكانية ان اغير النص فور كتابتي عند تحديد الخلية .. أو عند تحديد خلية ما تحديد النص الذي بداخلها

تم تعديل هذه المشاركة بواسطة Zaid Sultan في 31 أكتوبر 2013 في 22:34

#4

لم أفهم ! :mellow:

الكود الذي كتبتُه لك يقوم بتغيير محتوى الخلية عند الكتابة حتى لو لم يتم الضغط على enter !

تم تعديل هذه المشاركة بواسطة Snack3r في 1 نوفمبر 2013 في 01:00

#5

اخي يبدو أنك لم تفهمني .. ما اريده هو التالي 

 

على فرض عندنا خلية فيها القيمة التالية "man" في الوضع الطبيعي والذي اعطيتني اياه حضرتك فإنني عندما اكون على هذه الخلية واكتب شيئ ما مثل "hello" فإن ما يكتب في الخلية هو التالي "manhello"

ما أريده أنا يا عزيزي هو أن تكتب "hello" فقط وتُمحى "man" ... وذلك يمكن أن يتم عبر طريقة أنه عندما اقوم بتحديد خلية ما فإن النص الذي بداخلها يتحدد ويكون قابل للتعديل وبالتالي ان قمت بكتابة اي شيئ فإنه سيظهر بدل النص المحدد (المحتوى القديم للخلية) 

 

وشكراً

#6 أفضل إجابة

قم باستعادة الـ Model الذي تعمل عليه و أضف إليه حدث من نوع ListSelectionListener ثم أعد تعريف الدالة valueChanged حسب ما يناسبك. مثال :

package JTableListener;

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

public class TableModelListenerDemo {

    Object rowData[][] = {{"1", "one", "I"}, {"2", "two", "II"}, {"3", "three", "III"}};
    String columnNames[] = {"#", "English", "Roman"};

    public TableModelListenerDemo() {
        final JTable table = new JTable(rowData, columnNames);
        JScrollPane scrollPane = new JScrollPane(table);

        table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent event) {
                MyModel model = new MyModel(rowData, columnNames);
                model.setValueAt(table.getSelectedRow(), table.getSelectedColumn(), null);
            }
        });

        table.getModel().addTableModelListener(new TableModelListener() {

            @Override
            public void tableChanged(TableModelEvent e) {
                int row = e.getFirstRow();
                int column = e.getColumn();
                MyModel model = new MyModel(rowData, columnNames);
                Object data = model.getValueAt(row, column);
                model.setValueAt(row, column, data);
                System.out.println("value changed : " + data.toString() + " -- in row : "
                        + (row + 1) + ", column : " + (column + 1));
            }
        });

        JFrame frame = new JFrame("Table Model Listener Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.setSize(300, 150);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

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

بالتوفيق.

1

هذا الموضوع مغلق.

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