gpt4 book ai didi

java - 带有 ","分隔符而不是 "."的 Jtable 数字编辑器

转载 作者:行者123 更新时间:2023-11-29 06:56:06 25 4
gpt4 key购买 nike

我是法国人,对 Java 并不陌生。在法语中, double 有“,”分隔符而不是“.”。所以我有一个 JTable Cell,列类 = Double,当我输入例如 2.4 时就可以了。但是当我输入 2,4 时它会阻塞。

我使用了 Locale.setDefault(Locale.FRENCH); 但我得到了相同的结果:

Number

正如您在下图中所见,我的应用程序以法语语言环境启动: System Locale有什么方法可以输入 2,4 而不是 2.4 吗?

真诚的。

最佳答案

Is there any way to enter 2,4 rather than 2.4 ?

嗯,有几个问题。

  1. 默认渲染器将显示“.”不是“,”。
  2. 默认编辑器将显示“.”,而不是“,”
  3. 当您尝试将值保存到 TableModel 时,默认编辑器不会将“,”识别为 Double 的有效字符

当您离开单元格时,输入的字符串必须转换为 Double。但是,即使使用法语语言环境,Double.parseDouble(...) 方法也无法识别“,”。

默认单元格编辑器意识到无法正确转换字符串,因此单元格以红色边框突出显示以指示无效值。

下面的解决方案使用自定义编辑器在内部处理“,”到“.”的转换。在 String 被解析为 Double 之前。它还将转换“。”为“,”,以便该值在编辑器中正确显示。

import java.awt.*;
import java.text.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;

public class LocaleEditor extends DefaultCellEditor
{
private Object value;

public LocaleEditor()
{
super( new JTextField() );
((JTextField)getComponent()).setHorizontalAlignment(JTextField.RIGHT);
}

@Override
public Object getCellEditorValue()
{
return value;
}

@Override
public boolean stopCellEditing()
{
try
{
String editingValue = (String)super.getCellEditorValue();

// Don't allow user to enter "."

if (editingValue.contains("."))
{
JTextField textField = (JTextField)getComponent();
textField.setBorder(new LineBorder(Color.red));
return false;
}

// Replace local specific character

int offset = editingValue.lastIndexOf(",");

if (offset != -1)
{
StringBuilder sb = new StringBuilder(editingValue);
sb.setCharAt(offset, '.');
editingValue = sb.toString();
}

value = Double.parseDouble( editingValue );
}
catch(NumberFormatException exception)
{
JTextField textField = (JTextField)getComponent();
textField.setBorder(new LineBorder(Color.red));
return false;
}

return super.stopCellEditing();
}

@Override
public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column)
{
Component c = super.getTableCellEditorComponent(table, value, isSelected, row, column);

JTextField textField = (JTextField)c;
textField.setBorder( new LineBorder(Color.BLACK) );

String text = textField.getText();
int offset = text.lastIndexOf(".");

// Display local specific character

if (offset != -1)
{
StringBuilder sb = new StringBuilder(text);
sb.setCharAt(offset, ',');
textField.setText( sb.toString() );
}

return c;
}

private static void createAndShowUI()
{
String[] columnNames = {"String", "Double", "Boolean"};

Object[][] data =
{
{"A", new Double(1), Boolean.TRUE },
{"B", new Double(2.25), Boolean.FALSE},
{"C", new Double(12.34), Boolean.TRUE },
{"D", new Double(1234.56), Boolean.FALSE}
};

DefaultTableModel model = new DefaultTableModel(data, columnNames)
{
// Returning the Class of each column will allow different
// renderers and editors to be used based on Class

public Class getColumnClass(int column)
{
for (int row = 0; row < getRowCount(); row++)
{
Object o = getValueAt(row, column);

if (o != null)
return o.getClass();
}

return Object.class;
}
};

JTable table = new JTable(model);
table.setRowHeight(20);

table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane( table );
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

// Use a custom renderer and editor

NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);
nf.setMinimumFractionDigits(2);
TableCellRenderer renderer = new NumberRenderer( nf );
table.setDefaultRenderer(Double.class, renderer);
TableCellEditor fce = new LocaleEditor();
table.setDefaultEditor(Double.class, fce);

JFrame frame = new JFrame("Table Five Character Editor");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( scrollPane );
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
}

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}

以上代码还使用了在 Table Format Renderers 中找到的代码,它允许您轻松地为给定的 Locale 创建自定义渲染器。如果您不想使用渲染器,只需注释掉代码,然后注释掉“。”将显示在表格中。

关于java - 带有 ","分隔符而不是 "."的 Jtable 数字编辑器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33841594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com