2014-03-13 6 views
0

Я создал JTable с пользовательской табличной моделью (MyTableModel.java), и я использовал некоторый класс CellRenderer для просмотра эффекта ячейки. Я использовал класс CustomTableCellRenderer, чтобы изменить текущую ячейку как зеленый фон. Он отлично работает. В то же время я создал класс RenderPrice, чтобы показать ячейку в десятичном типе, она принимает десятичное значение, когда я выполнял сначала, если я отредактирую ячейку, которая не обновлена, и она будет показывать знак $ в качестве префикса. Я хочу это решить. Пожалуйста, предоставьте некоторое решение как можно скорее. благодаряИзмените двойное значение в ячейке

класс RenderPrice код

class RenderPrice extends DefaultTableCellRenderer { 
    Object result; 
    RenderPrice() { 
     setHorizontalAlignment(SwingConstants.RIGHT); 
    } 

    public void setValue(Object aValue) { 
     result = aValue; 
     if ((aValue != null) && (aValue instanceof Number)) { 
      Number numberValue = (Number)aValue; 
      NumberFormat formatter = NumberFormat.getCurrencyInstance(); 
      result = formatter.format(numberValue.doubleValue()); 
     } 
     super.setValue(result); 
    } 
} 

предшествующий код моего TableClass (Accept.java)

gradeColumn = jTable1.getColumnModel().getColumn(2); 
gradeColumn.setCellRenderer(new RenderPrice()); 

gradeColumn = jTable1.getColumnModel().getColumn(0); 
gradeColumn.setCellEditor(new IntegerEditor(1,100)); 

gradeColumn = jTable1.getColumnModel().getColumn(0); 
gradeColumn.setCellRenderer(new CustomTableCellRenderer()); 

gradeColumn = jTable1.getColumnModel().getColumn(1); 
gradeColumn.setCellEditor(new ComboBoxCellEditor(comboBox)); 
+0

все в большинстве своего/остальную часть коды, для лучшей помощи скорее опубликовать SSCCE или MCVE или MCTRE, короткий, работоспособный, компилируемый, примерно JTable в JFrame с закодированным значением, хранящимся в местной varibale для JTable/XxxTableModel – mKorbel

+0

Я не могу уловить точку, пожалуйста, сообщите подробно – user3391137

ответ

2

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

class RenderPrice extends DefaultTableCellRenderer 
{ 
    @Override 
    public Component getTableCellRendererComponent(
     JTable table, Object value, boolean isSelected, 
     boolean hasFocus, int row, int column) 
    { 
     super.getTableCellRendererComponent(
      table, value, isSelected, hasFocus, row, column); 

     if ((value != null) && (value instanceof Number)) 
     { 
      Number numberValue = (Number)value; 
      NumberFormat formatter = NumberFormat.getCurrencyInstance(); 
      String valueString = formatter.format(numberValue.doubleValue()); 
      setText(valueString); 
     } 

     return this; 
    } 
} 

EDIT: В ответ на замечания, и пример

import java.text.NumberFormat; 
import java.text.ParseException; 

import javax.swing.DefaultCellEditor; 
import javax.swing.JFormattedTextField; 
import javax.swing.JFrame; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.SwingConstants; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.TableColumn; 
import javax.swing.text.NumberFormatter; 

public class CurrencyCellEditorTest 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JTable table = new JTable(
      new Object[][]{ 
       { 1.2, 3.4 }, 
       { 5.6, 7.8 } 
      }, 
      new Object[] { 
       "A", "B" 
      }); 


     TableColumn column0 = table.getColumnModel().getColumn(0); 
     column0.setCellEditor(new PriceEditor()); 
     column0.setCellRenderer(new PriceRenderer()); 

     TableColumn column1 = table.getColumnModel().getColumn(1); 
     column1.setCellEditor(new PriceEditor()); 
     column1.setCellRenderer(new PriceRenderer()); 

     f.getContentPane().add(table); 
     f.setSize(400,400); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 

    } 
} 

class PriceRenderer extends DefaultTableCellRenderer 
{ 
    PriceRenderer() 
    { 
     setHorizontalAlignment(SwingConstants.RIGHT); 
    } 

    @Override 
    public void setValue(Object aValue) 
    { 
     Object result = aValue; 
     if ((aValue != null) && (aValue instanceof Number)) 
     { 
      Number numberValue = (Number) aValue; 
      NumberFormat formatter = NumberFormat.getCurrencyInstance(); 
      result = formatter.format(numberValue.doubleValue()); 
     } 
     super.setValue(result); 
    } 
} 

class PriceEditor extends DefaultCellEditor 
{ 
    public PriceEditor() 
    { 
     super(createComponent()); 
     delegate = new EditorDelegate() 
     { 
      @Override 
      public void setValue(Object value) 
      { 
       Number numberValue = 0.0; 
       if (value != null && value instanceof Number) 
       { 
        numberValue = (Number)value; 
       } 
       getFormattedTextField().setValue(numberValue); 
      } 

      @Override 
      public Object getCellEditorValue() 
      { 
       try 
       { 
        NumberFormat numberFormat = NumberFormat.getCurrencyInstance(); 
        String text = getFormattedTextField().getText(); 
        Number number = numberFormat.parse(text); 
        return number; 
       } 
       catch (ParseException e) 
       { 
        e.printStackTrace(); 
        return new Double(0.0); 
       } 
      } 
     }; 
    } 

    private static JTextField createComponent() 
    { 
     NumberFormat numberFormat = NumberFormat.getCurrencyInstance(); 
     NumberFormatter numberFormatter = new NumberFormatter(numberFormat); 
     JFormattedTextField formattedTextField = new JFormattedTextField(numberFormatter); 
     formattedTextField.setHorizontalAlignment(SwingConstants.RIGHT); 
     return formattedTextField; 
    } 

    private JFormattedTextField getFormattedTextField() 
    { 
     return (JFormattedTextField)getComponent(); 
    } 

} 
+0

, когда в первый раз выполнения он будет отображаться в двойной форме, но если я нажму на ячейку, то штемпеля $ sign и редактируемое значение не будут изменены как double.can't i override setValue здесь? – user3391137

+0

@ user3391137 В этом случае вам также нужно будет установить соответствующий редактор. См. Http://www.informit.com/articles/article.aspx?p=333472&seqNum=3, например – Marco13

+0

'Вы не должны использовать (или переопределять)' - уверен, что можете. Этот метод используется для установки значения, которое должно отображаться. Он не изменяет данные в модели. – camickr

1

Заканчивать Table Format Renderers легкий способ создать свой собственный визуализатор. Вы просто указываете конкретный Formatter.

В этом случае класс имеет удобный метод форматирования валюты.

TableColumnModel m = table.getColumnModel(); 
m.getColumn(???).setCellRenderer(NumberRenderer.getCurrencyRenderer()); 
Смежные вопросы