Jtable java запретить редактирование

Jtable java запретить редактирование

В ячейке Jtable объект «bo»,
у объекта аттрибут isEditable = false,
по двойному щелчку на ячейке захожу в редактирование ячейки и вижу все то, что возвращает, переопределенный, toString().
Как запретить редактирование ячейки, если isEditable == false и разрешить, если isEditable == true .

не слишком понятно.
setCellEditable не обнаружен.

Правильно ли я понял,
Нужно наследоваться от JTable и переопределять isCellEditable ?

Здравствуйте, Аноним, Вы писали:

А>>>Куда рыть?
А>>http://java.sun.com/javase/6/docs/api/javax/swing/table/TableModel.html#isCellEditable(int,%20int)

А>не слишком понятно.
А>setCellEditable не обнаружен.

А>Правильно ли я понял,
А>Нужно наследоваться от JTable и переопределять isCellEditable ?

Ы? По ссылке ИНТЕРФЕЙС TableModel. Там же указаны его стандартные реализации. Вот что-то из этого и следует реализовать\переопределить.

Здравствуйте, GarryIV, Вы писали:

GIV>Здравствуйте, Аноним, Вы писали:

А>>>>Куда рыть?
А>>>http://java.sun.com/javase/6/docs/api/javax/swing/table/TableModel.html#isCellEditable(int,%20int)

А>>не слишком понятно.
А>>setCellEditable не обнаружен.

А>>Правильно ли я понял,
А>>Нужно наследоваться от JTable и переопределять isCellEditable ?

GIV>Ы? По ссылке ИНТЕРФЕЙС TableModel. Там же указаны его стандартные реализации. Вот что-то из этого и следует реализовать\переопределить.

Хочется попросить примерчик, но не знаю прилично ли это.

А вот так можно или нет?
public class MyjTable extends JTable

@Override
public boolean isCellEditable(int row, int column)

BaseObject bo = (BaseObject) getValueAt(row, column);

тут проблемка. все работает, но если войти в редактирование ячейки,то при выходе из редактирования
getValueAt возвращает объект, который не BaseObject, a String и все падает в исключение.
А вот без редактирования все работает. или мне так кажется, что все работает. ;-(

еще одна засада в том, что В некоторых ячейках BaseObject а в некоторых Sting, может оттуда ноги у исключений.
Как проверить какого типа вернулся объект?
нарыл
Object o = getValueAt(row, column);
o.getClass()
но дальше куда?

Здравствуйте, Аноним, Вы писали:

А>тут проблемка. все работает, но если войти в редактирование ячейки,то при выходе из редактирования
А>getValueAt возвращает объект, который не BaseObject, a String и все падает в исключение.
А>А вот без редактирования все работает. или мне так кажется, что все работает. ;-(

TableModel::setValueAt
вызывается после успешного редактирования. перекройте этот метод, например, по умолчанию text editor вернет строку и Object будет строка, вы её парсите в свой объект и сохраняете его (вопрос где — если не перекрывали getValuAt — поройтесь что там у дефолтной реализации, перекрыли — тогда знаете). и вуаля!

Здравствуйте, zubr, Вы писали:

Z>Здравствуйте, Аноним, Вы писали:

А>>тут проблемка. все работает, но если войти в редактирование ячейки,то при выходе из редактирования
А>>getValueAt возвращает объект, который не BaseObject, a String и все падает в исключение.
А>>А вот без редактирования все работает. или мне так кажется, что все работает. ;-(

Z>TableModel::setValueAt
Z>вызывается после успешного редактирования. перекройте этот метод, например, по умолчанию text editor вернет строку и Object будет строка, вы её парсите в свой объект и сохраняете его (вопрос где — если не перекрывали getValuAt — поройтесь что там у дефолтной реализации, перекрыли — тогда знаете). и вуаля!

Читайте также:  Заголовок таблицы

Кажется я начинаю немного понимать в чем дело

public void setValueAt(Object aValue, int row, int column)

super.setValueAt(aValue, row, column);
>

Но в одной ячейке BaseObject, а в другой String.

Если в aValue String, то я его сначала суну в

BaseObject b0 = new BaseObject();
b0.SetName(aValue.toString);

a потом super.setValueAt(b0, row, column);

Если aValue есть BaseObject,

то сразу super.setValueAt(aValue, row, column);

А вот как мне узнать в aValue пришла строка или BaseObject ?

Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, zubr, Вы писали:

Z>>Здравствуйте, Аноним, Вы писали:

А>>>тут проблемка. все работает, но если войти в редактирование ячейки,то при выходе из редактирования
А>>>getValueAt возвращает объект, который не BaseObject, a String и все падает в исключение.
А>>>А вот без редактирования все работает. или мне так кажется, что все работает. ;-(

Z>>TableModel::setValueAt
Z>>вызывается после успешного редактирования. перекройте этот метод, например, по умолчанию text editor вернет строку и Object будет строка, вы её парсите в свой объект и сохраняете его (вопрос где — если не перекрывали getValuAt — поройтесь что там у дефолтной реализации, перекрыли — тогда знаете). и вуаля!

А>Кажется я начинаю немного понимать в чем дело

А> public void setValueAt(Object aValue, int row, int column) <

А> super.setValueAt(aValue, row, column);
А> >

А>Но в одной ячейке BaseObject, а в другой String.

А>Если в aValue String, то я его сначала суну в

А>BaseObject b0 = new BaseObject();
А>b0.SetName(aValue.toString);

А>a потом super.setValueAt(b0, row, column);

А>Если aValue есть BaseObject,

А>то сразу super.setValueAt(aValue, row, column);

А>Правильно?

А>А вот как мне узнать в aValue пришла строка или BaseObject ?

Добрался вот так:
String clName = aValue.getClass().getSimpleName();

Здравствуйте, Аноним, Вы писали:

А>Добрался вот так:
А>String clName = aValue.getClass().getSimpleName();

А>Правильно?
все относительно, лучше вот так

 if(aValue instanceof BaseObject)< //BaseObject >else< // string >

Здравствуйте, Аноним, Вы писали:

А>Но в одной ячейке BaseObject, а в другой String.

то есть в вашей модели в разных ячейках разные типы объектов?(до редактирования).

Здравствуйте, jitm, Вы писали:

J>Здравствуйте, Аноним, Вы писали:

А>>Добрался вот так:
А>>String clName = aValue.getClass().getSimpleName();

А>>Правильно?
J> все относительно, лучше вот так

J>

J> if(aValue instanceof BaseObject) < J>//BaseObject J> >else < J>// string J> > J>

Гениально!
Мне этот instanceof, как заноза в пальце. Все я думал о нем, но подступиться как-то не сложилось. Бред конечно. Виноват.
Спасибо. Уже все работает, но сейчас заменю.

Источник

Как настроить запрет на редактирования столбца в таблице

Как настроить запрет на редактирования столбца в таблице.

Или в классе где создается дефолтная модель таблицы ?
Или в классе где описываю фрейм, в котрый будет встроена таблица?
Покажите, пожалуйста пример.

Запрет редактирования данных в таблице
Подскажите плиз как сделать запрет на редактирование данных из аксеса таблицы DBGrid добавленной на.

Запрет редактирования одного столбца
Добрый день, поставили задачу разработки журнала, для реализации была выбрана делфи. Нужно сделать.

Запрет редактирования столбца DataGrid
Добрый день всем! Весь день убил на решение такой проблемы: вставляю в DataGrid DataTable: .

Читайте также:  Design pattern python pdf

Запрет редактирования одного столбца StringGrid
как можно запретить редактировать один из столбцов таблицы? например, 4-ый я разрешил изменять.

jTable[i] = new JTable(6,6) { private static final long serialVersionUID = 1L; public boolean isCellEditable(int row, int col) { return (col == 1 && row == 1); } };

Лучший ответ

Сообщение было отмечено masli как решение

Решение

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
package com.trainigcenter.CarsOfRentV3.frames; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.Vector; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; /** * Создание модели таблиц * * @DefaultTableModel defaultModel - создаем модель таблицы по умолчанию * @ResultSetMetaData rsmd; - хранение служебной информации о таблице for (int i * = 1; i  * обрабатывает таблицу, получая имена полей(столбцов) данной * таблицы addColumn() - это метод добавлет в модель таблицы, * только шапку таблицы while * * @(rs.next()) < - запускаем * цикл, который обрабатывает столбцы текущей строки в * таблице Vector v - создаем коллекцию класса * Vector v.add(rs.getString(i)) - обрабатываем полученную * строку и затем, значение каждого столбца помещаем в свою * позицию текущей строки обрабатываемой таблицы * defaultModel.addRow(v) - добавление строку в модель * таблицы ( модель по умолчанию) После того, как цикл while * пройдет всю обрабатываемую таблицу и модель таблицы будет * заполнена, она с помощью метода setModel, регистрируется и * далее этот объект можно помещать во нужный фрейм. @ @ * this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); - * позволяет растягивать столбцы вручную * @setAutoResizeMode(AUTO_RESIZE_ALL_COLUMNS); - автоматическая подстройка ширины столбца * в зависимости от ширины названия поля * public boolean isCellEditable(int row, int column) - запрет на редактирование 1-го столбца в таблице * @ @author IT * */ public class MyTable extends JTable { private static final long serialVersionUID = 1L; public MyTable(ResultSet rs) { super(); DefaultTableModel defaultModel = new DefaultTableModel(); ResultSetMetaData rsmd; try { rsmd = rs.getMetaData(); for (int i = 1; i = rsmd.getColumnCount(); i++) { defaultModel.addColumn(rsmd.getColumnName(i)); } while (rs.next()) { VectorString> v = new VectorString>(); for (int i = 1; i = rsmd.getColumnCount(); i++) { v.add(rs.getString(i)); } defaultModel.addRow(v); } this.setModel(defaultModel); setAutoResizeMode(AUTO_RESIZE_ALL_COLUMNS); } catch (SQLException ex) { System.out.println(" Ошибка в классе MyTable " + ex); } } @Override public boolean isCellEditable(int row, int column) { if(column == 0) { return false; } return true; } }

Источник

Отключить редактирование пользователя в JTable

Когда компонент JTable создается, редактирование ячеек включено по умолчанию. Как я могу запретить пользователю редактировать содержимое JTable?

JTable использует объект AbstractTableModel. Это то, что вы передаете в конструктор JTable. Вы можете написать свой собственный AbstractTableModel следующим образом

public class MyTableModel extends AbstractTableModel < public boolean isCellEditable(int row, int column)< return false; >> 

а затем инициализируйте JTable как

JTable myTable = new JTable(new MyTableModel()); 

Вы можете создать JTable, используя следующий код:

 JTable jTable = new JTable() < private static final long serialVersionUID = 1L; public boolean isCellEditable(int row, int column) < return false; >; >; 

В основном то, что мы делаем здесь, переопределяет isCellEditable и всегда возвращает false из него. Это сделает не редактируемую JTabel.

myTable.setDefaultEditor(Object.class, null); 

Привет, я много работаю над java, поэтому я дам вам свой путь:
Есть две возможности первой под netbeans. Перейдите к настройке кода и сделайте так:

JTArticleJPAddArrticle = new javax.swing.JTable(); JTArticleJPAddArrticle.setBackground(new java.awt.Color(204, 204, 255)); JTArticleJPAddArrticle.setModel(new javax.swing.table.DefaultTableModel( new Object [][] < >, new String [] < "Reference","Libellé","Marque","Prix d'achat","Prix de vente","Quantité","Total","Etat" >) < public boolean isCellEditable(int rowIndex, int columnIndex) < return false; >>); jScrollPane8.setViewportView(JTArticleJPAddArrticle); 

Мой другой способ – сделать экземпляр модели таблицы. Это второй способ:

model=new DefaultTableModel(head, 0) < @Override public boolean isCellEditable(int i, int i1) < return false; //To change body of generated methods, choose Tools | Templates. >>; jtable.setmodel(model); 

Наслаждайтесь, что это хорошо работает для меня. Все, что я хочу сделать, это помочь вам, ребята, потому что мне помогли намного раньше.

JTable table = new JTable(); table.setEnabled(false); 

Устанавливает, включен ли этот компонент. Компонент, который включен, может реагировать на ввод пользователя, а компонент, который не включен, не может реагировать на ввод пользователя. Некоторые компоненты могут изменять свое визуальное представление, когда они отключены, чтобы обеспечить обратную связь с пользователем, что они не могут принимать входные данные.

Когда дело доходит до JTable, похоже, он вообще не дает никакой визуальной обратной связи. С перком все еще можно нажать на заголовки столбцов. И в моей реализации приложение все равно может изменить содержимое ячеек.

 tm = new javax.swing.table.DefaultTableModel() < public ClassgetColumnClass(int column) < switch(column) < case 0: return String.class; case 1: return String.class; case 2: return String.class; case 3: return String.class; case 4: return String.class; case 5: return String.class; case 6: return String.class; case 7: return String.class; case 8: return String.class; case 9: return String.class; case 10: return String.class; case 11: return Boolean.class; default: return String.class; >> @Override public boolean isCellEditable(int row, int column) < /* Set the 11th column as editable and rest non- editable */ if(column==11)< return true; >else < //all other columns to false return false; >> >; table = new javax.swing.JTable(tm); 

В этом методе “isCellEditable” мы можем включать и отключать пользовательское редактирование для определенного столбца. В этом случае включите столбец = 11 и отключите оставшуюся часть столбца

Что касается NetBeans, вы можете щелкнуть правой кнопкой мыши по таблице и щелкнуть по содержимому таблицы, затем перейдите на вкладку столбца и снимите флажок “Редактируемый”. Привет!!

Я знаю, что я опоздал, но надеюсь, что кто-то получит это. Вы можете просто добавить слушателя мыши следующим образом:

jtable.addMouseListener( new MouseAdapter () < @Override public void mouseClicked ( MouseEvent e ) < columnIndex = replacedAssets.getSelectedColumn (); System.out.println ( "Double click on jtable" ); if ( columnIndex == 1 || columnIndex == 2 ) < JOptionPane.showMessageDialog ( parent , "Editing this Field may cause error in the data." , "Error Edit Not Permitted For This Field" , JOptionPane.ERROR_MESSAGE ); >> >); 

этот код запрещает редактирование столбцов индексов 1 и 2, вы можете удалить условие if, чтобы это работало для всех столбцов.

Источник

Оцените статью