Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемещение фокуса при редактировании ячеек таблиц, Использование JFormattedTextField 
:(
    Опции темы
Connie
Дата 3.9.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 8
Всего: 9



Здравствуйте!
Есть таблица из двух колонок, вторая колонка редактируемая, в ней double 
Для этой колонки устанавливается свой редактор, вместо дефолтного по той причине. что дефолтный требует вводить точку, вместо запятой как разделитель дробной и целой части

Код
tbl = new JTable(2,3);
MyTableModel mdl = new MyTableModel();
tbl.setModel(mdl);
tbl.getColumnModel().getColumn(1).setCellEditor(new DoubleEditor());


Код

package Interfaces;


import javax.swing.AbstractCellEditor;
import javax.swing.JFormattedTextField;
import javax.swing.JTable;
import java.awt.Component;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;
import java.text.NumberFormat;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;

public class DoubleEditor extends AbstractCellEditor
implements TableCellEditor/*, ActionListener*/, PropertyChangeListener {
    private JFormattedTextField fld;
    NumberFormat formatter = NumberFormat.getNumberInstance();
       
    public DoubleEditor(){ 
        super(); 
        fld = new JFormattedTextField();
        fld.addPropertyChangeListener("value", this);
        fld.setHorizontalAlignment(JTextField.RIGHT);
        formatter.setMinimumFractionDigits(2);
        formatter.setMaximumFractionDigits(2);
        
    }
    
    public Object getCellEditorValue(){
          return fld.getValue();
    }
    public Component getTableCellEditorComponent(JTable table,
                                      Object value,
                                      boolean isSelected,
                                      int row,
                                      int column){
        fld.setValue(((Number)value).doubleValue());
        fld.selectAll();
        
        return fld;
    }
    
    public void propertyChange(PropertyChangeEvent e) {
        //Установили новое значение, т.е. нажали Enter        
        JFormattedTextField source = (JFormattedTextField)e.getSource();
       // fld.setBackground(Color.lightGray);
         fireEditingStopped();
    }
 }


Все работает если войти в редактирование значения кликнув мышкой по ячейке: начинается редактирование, после нажатия Enter значение присваивается и фокус остается на этой ячейке

Если же начать набирать значение или левые символы в тот момент, когда фокус находится на нужной ячейке, то вроде бы происходит редактирование, но присваивания значения после нажатия Enter или перемещения указателя другим способом ячейке (значению в массиве, в модели таблицы) не происходит, зато фокус перемещается к следующей ячейке, а этого хотелось бы достигнуть при нормальном вводе.
PM MAIL WWW   Вверх
alexsaltykov
Дата 3.9.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 17.8.2007

Репутация: нет
Всего: нет



В модели таблицы переопредели метод setValueAt
для того что бы введенное значение записывало в твою модель данных



PM MAIL   Вверх
Connie
Дата 3.9.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 8
Всего: 9



alexsaltykov, есть этот метод, иначе бы вызывался редактор, но значение бы не запоминалось
Код

public void setValueAt(Object value, int row, int col) {
            if (DEBUG) {
                System.out.println("Setting value at " + row + "," + col
                                   + " to " + value
                                   + " (an instance of "
                                   + value.getClass() + ")");
            }
            if (value==null) TableData[row][col] = 0.0;
            else 
            {    TableData[row][col] = value;
                
            }
            fireTableCellUpdated(row, col);
}

В том то и дело, что по разному происходит обратотка. Если кликнуть мышкой, то начинает работать JFormattedTextField и работает так, как ему и положено. А вот при начале ввода с клавиатуры, вызывается какой то другой редактор...
PM MAIL WWW   Вверх
alexsaltykov
Дата 5.9.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 17.8.2007

Репутация: нет
Всего: нет



модель таблицы выложи 
PM MAIL   Вверх
alexsaltykov
Дата 5.9.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 17.8.2007

Репутация: нет
Всего: нет



Попробуй изменить этот метода
Код

        public Object getCellEditorValue(){         
              return Double.parseDouble(fld.getText());    
        }

PM MAIL   Вверх
Connie
Дата 5.9.2008, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 8
Всего: 9



alexsaltykov, уезжал, не мог ответить
Цитата
 Попробуй изменить этот метода
Не дает это ничего.

Я принудительно у таблицы менял локаль, что бы при вводе числа double дефолтный редактор использовал запятую, а не точку, но толку нет

Цитата
модель таблицы выложи 
Я использовал простенькую модель, сейчас у меня более сложная, но это не принципиально, в приведенных примерах использовался такой массив
Object [] [] tableData = {{"раз",1.5},{"два",2.5},{"три",3.5}}

Тот который выложу сложнее, но работа такая же

Код

public class MenuTableModel extends AbstractTableModel {
    private Vector products;
    private int ColumnSize;
    private DecimalFormat frt;
    private Dose ds;
    private DPS dps;
    private Factors factors;
    private CalcType calcType;
    private MenuManager mgr;
    
    public MenuTableModel(MenuManager mgr,int ColumnSize,Factors factors, DPS dps,CalcType calcType){
         frt =  new DecimalFormat("#0.0");
         this.factors = factors;
         this.dps = dps;
         this.calcType = calcType;
         
         this.mgr = mgr;
         products = new Vector(mgr.getMenu());
         this.ColumnSize = ColumnSize;
    }
    
     public int getRowCount()
  {

    if (products != null) {
      return products.size();
    }
    return 0;
  }
  
  // Количество столбцов - 4
  public int getColumnCount()
  {
    return 4;
  }

  // Вернем наименование колонки
  public String getColumnName(int column)
  {
    String[] colNames = { "Наименование", "Вес", "Калор", "Доза" };
    return "<html><font size="+ColumnSize+">"+colNames[column]+"</font></html>";
  }

  // Возвращаем данные для определенной строки и столбца
  public Object getValueAt(int rowIndex, int columnIndex)

  {
    if (products != null) {
      // Получаем из вектора студента :) /*Спасибо Антону Сабурову, часть кода его*/
      ProductW prod = (ProductW) products.get(rowIndex);
      ds = new Dose(prod,factors,dps,CalcType.SPEED);
      // В зависимости от колонки возвращаем имя, фамилия и т.д.
      switch (columnIndex) {
      case 0:
        return prod.getName();

      case 1:
        return prod.getWeight();//frt.format(prod.getWeight());

      case 2:  
        return ds.getCalories();//frt.format(ds.getCalories());

      case 3:
        return ds.getWholeDose();//frt.format(ds.getWholeDose());
      
      }
    }
    return null;
  }
  
  public void setValueAt(Object value, int row, int col){
      if (col==1)
      {
      ProductInMenu prod = (ProductInMenu)products.get(row);
      prod.setWeight(((Number)value).floatValue());
      mgr.updateProd(prod);
      }
  }
  
  //Добавляем сразу целиком измененную таблицу
  public void setNewProducts(Vector products){
      this.products = products;
  }
  
  public ProductW getProductAtRow(int Row){
      if ((products!=null)&&(Row<products.size())){
          return (ProductW)products.get(Row);
      }
      return null;
  }
   public ProductW getSumProd(){
      if (products!=null){
          ProductW res = new ProductW();
          for (Object item : products) {
             res.plusProd((ProductW)item);
          }
          return res;
      }
      return null;
  }
   
  public void setDPS(DPS dps){
      this.dps = dps;
  }
  
  public void setCalcType(CalcType calcType){
      this.calcType = calcType;
  }
  
  public void setFactors(Factors fcs){
      this.factors = fcs;
  }
 
  /*
         * JTable uses this method to determine the default renderer/
         * editor for each cell.  If we didn't implement this method,
         * then the last column would contain text ("true"/"false"),
         * rather than a check box.
         */
  public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
  }    
  
  /*
     * Don't need to implement this method unless your table's
     * editable.
     */
    public boolean isCellEditable(int row, int col) {
        //Note that the data/cell address is constant,
        //no matter where the cell appears onscreen.
        return col==1;
    }
}


вообщем то работа с другим редактором (JFormattedTextField) получается, проблема в том, как запретить начало редактирования при  попадании фокуса на ячейку и ввода с клавиатуры или же как при таком событии вызывать именно тот редактор, который действительно нужен (JFormattedTextField)
PM MAIL WWW   Вверх
alexsaltykov
Дата 8.9.2008, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 17.8.2007

Репутация: нет
Всего: нет



DoubleEditor сделал на основе JTExtField
так как на основе JFormattedTextField() не получилось почему-то
но работает нормально и с точкой и с запятой
единственно может надо добавить метод на проверку ввода только цифр
вообщем попробуй...
Код

import java.awt.Component;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.NumberFormat;

import javax.swing.AbstractCellEditor;
import javax.swing.JFormattedTextField;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.CellEditorListener;
import javax.swing.table.TableCellEditor;

    public class DoubleEditor extends AbstractCellEditor
    implements TableCellEditor/*,, ActionListener, PropertyChangeListener*/ {


        private JTextField fld;

           
        public DoubleEditor(){ 
            fld = new JTextField();
        }
        
        public Object getCellEditorValue(){     
              return Double.parseDouble(fld.getText()); 
        }
        public Component getTableCellEditorComponent(JTable table,
                                          Object value,
                                          boolean isSelected,
                                          int row,
                                          int column){
            
         fld.setText(value.toString());
            fld.selectAll();            
            return fld;
        }

            
        public boolean stopCellEditing()
        {  
            fld.setText(fld.getText().replace(',', '.'));
            return super.stopCellEditing();
        }
     }    



PM MAIL   Вверх
Connie
Дата 8.9.2008, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 8
Всего: 9



Нашел что хотел  smile 
http://lists.apple.com/archives/java-dev/2...n/msg00329.html

Теперь после набора текста при выделенной ячейке, запускается мой редактор основанный на JFormattedTextField
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.