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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> jTableCellEditor 
V
    Опции темы
Swatch
Дата 18.9.2007, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день. 

Пытаюсь поместить форматтед текст филд в таблицу. написала свой эдитор. вот такой:

Код

/*
 * Editor.java
 *
 * Created on 17 Сентябрь 2007 г., 13:20
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package com.acorah.propertyplanner.classes;

import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseEvent;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;
import java.util.EventObject;
import javax.swing.DefaultCellEditor;
import javax.swing.JFormattedTextField;
import javax.swing.JFormattedTextField.AbstractFormatter;
import javax.swing.JTable;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;
import javax.swing.SwingConstants;

/**
 *
 * @author swatch
 */
public class Editor extends DefaultCellEditor {
      JFormattedTextField ftf = new JFormattedTextField();
      protected int clickCountToStart = 1;
      protected EditorDelegate delegate;
      private DefaultFormatterFactory factory;
      
    public Object getCellEditorValue() {
        try{
          Double _parse = Double.parseDouble(ftf.getText());
          return _parse;
        }catch(NumberFormatException e){
           return ftf.getValue();
        }
    }
            
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        ftf.setValue(value);
        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
        dfs.setGroupingSeparator(',');
        AbstractFormatter displayFormatter = new NumberFormatter(new DecimalFormat("#,###", dfs));
        ((NumberFormatter)displayFormatter).setValueClass(Object.class);
        AbstractFormatter editFormatter = new NumberFormatter(new DecimalFormat("#,###"));
        ((NumberFormatter)editFormatter).setValueClass(Object.class);
        DefaultFormatterFactory factory = new DefaultFormatterFactory(displayFormatter,displayFormatter,editFormatter);
        ftf.setFormatterFactory(factory);
        ftf.setHorizontalAlignment(SwingConstants.RIGHT);
        return ftf;
    }
    
    public boolean isCellEditable(EventObject anEvent) { 
    if (anEvent instanceof MouseEvent) { 
        return ((MouseEvent)anEvent).getClickCount() >= clickCountToStart;
        }
    return true; 
    }
    
    public void setClickCountToStart() {
    clickCountToStart = 1;
    }
   
    public void setValue(Object value) {
       Double val = (Double)value;
       if (ftf.getText().length() != 0){
           if (val == null){
              ftf.setValue(null);
           }else {
               Double d = val.doubleValue();
               ftf.setValue(d);
               ftf.setText(ftf.getValue().toString());
           }
       } else {
           ftf.setValue(null);
            ftf.setText("");
       }     
    }
    
    public boolean stopCellEditing() {
    fireEditingStopped(); 
    return true;
    }
    
    public Editor(final JFormattedTextField ftf){
        super(ftf);
        ftf.setFocusLostBehavior(JFormattedTextField.COMMIT);
        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
        dfs.setGroupingSeparator(',');
        AbstractFormatter displayFormatter = new NumberFormatter(new DecimalFormat("#,###", dfs));
        ((NumberFormatter)displayFormatter).setValueClass(Object.class);
        AbstractFormatter editFormatter = new NumberFormatter(new DecimalFormat("#,###"));
        ((NumberFormatter)editFormatter).setValueClass(Object.class);
        DefaultFormatterFactory factory = new DefaultFormatterFactory(displayFormatter,displayFormatter,editFormatter);
        ftf.setFormatterFactory(factory);
        ftf.setHorizontalAlignment(SwingConstants.RIGHT);
        ftf.setBorder(null);
        
        ftf.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
               JFormattedTextField ftf = (JFormattedTextField)evt.getSource();
                
               ftf.setSelectionStart(0);
               ftf.setSelectionEnd(ftf.getText().length());
               ftf.setSelectedTextColor(Color.BLACK);
            }
        });
        
        ftf.addFocusListener(new FocusAdapter(){
            public void focusGained(FocusEvent e){
               JFormattedTextField ftf = (JFormattedTextField) e.getSource();
                
               ftf.setSelectionStart(0);
               ftf.setSelectionEnd(ftf.getText().length());
               ftf.setSelectedTextColor(Color.BLACK);         
                
            }
            
            public void focusLost(FocusEvent e){
               JFormattedTextField ftf = (JFormattedTextField) e.getSource();
                try {
                    ftf.commitEdit();                          
                } catch (ParseException ex) {
                    ftf.setValue(null);
                }       
                
            }
        });
        
        ftf.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                stopCellEditing();
            }
        });
    }
}   


Все нормлаьно работает. Только если редактировать ячейку, в которой было что-то записано, то значение не сохраняется, если не нажать сначала энтер. Может кто понимает, в чем дело?

И еще, т.к. редактируется постоянно какая-то ячейка, то текст никогда не отображается с запятой. и почему-то никогда не выделяется при попадании фокуса.

Кстати, форматтед текст филд помезаю в таблицу вот так:
Код

JFormattedTextField jtf1 = new JFormattedTextField();
        jtf1.addFocusListener(new FocusAdapter(){
            public void focusGained(FocusEvent e)
            {
                JFormattedTextField jtf1 = (JFormattedTextField) e.getSource();
                
                jtf1.setSelectionStart(0);
                jtf1.setSelectionEnd(jtf1.getText().length());
                jtf1.setSelectedTextColor(Color.BLACK);         
                
            }
            
        });
        TableColumn column1=jTable1.getColumnModel().getColumn(1);
        column1.setCellEditor(new Editor(jtf1));
        for (int row=0; row<jTable1.getRowCount(); row++){
            Editor editor1 = (Editor)jTable1.getCellEditor(row,1);    
            editor1.setClickCountToStart();
        } 


Есть какие-нибудь идеи по моим вопросам??? Очень нужна помощь!!! smile 
PM MAIL   Вверх
goodday1941
Дата 18.9.2007, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

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



по поводу первого

try {
            table.getCellEditor().stopCellEditing();
} catch (Exception e) {
//
}

насильно останавливаем редактирование ячейки

Добавлено через 2 минуты
Цитата(Swatch @  18.9.2007,  10:59 Найти цитируемый пост)
И еще, т.к. редактируется постоянно какая-то ячейка, то текст никогда не отображается с запятой. и почему-то никогда не выделяется при попадании фокуса.

нипонятно что Вы хотели сказать


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
Swatch
Дата 18.9.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вот эта штука в обычных форматтерах при потере фокуса вместо пробела ставит запятые:
Код

DecimalFormatSymbols dfs = new DecimalFormatSymbols();
        dfs.setGroupingSeparator(',');
        AbstractFormatter displayFormatter = new NumberFormatter(new DecimalFormat("#,###", dfs));
        ((NumberFormatter)displayFormatter).setValueClass(Object.class);



а вот эта:
Код

jtf1.addFocusListener(new FocusAdapter(){
            public void focusGained(FocusEvent e)
            {
                JFormattedTextField jtf1 = (JFormattedTextField) e.getSource();
                
                jtf1.setSelectionStart(0);
                jtf1.setSelectionEnd(jtf1.getText().length());
                jtf1.setSelectedTextColor(Color.BLACK);         
                
            }
            
        });


при получении фокуса выделяет текст.

Но для таблицы этто не работает. но мне жизненно необходимо, чтобы по окончанию редактирования пробел заменялся на запятые, а при начале, чтобы текст выделялся. smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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