swing.JTextField java中的阿拉伯数字

时间:2011-10-25 08:01:54

标签: java swing internationalization

和平在你们身上。

javas.swing.JTextField不支持输入等阿拉伯语,希伯来语,中文等其他语言的数字。我已经研究了很多,但我找不到解决方案。

我真的需要功能,因为我的整个应用程序都基于Javax.swing组件。

需要解决方案的人!!!

  
    

将JTextField放在简单的纯GUI上。转到区域设置并选择阿拉伯语(saudia arabia)作为区域设置,并将“数字替换”自定义为“国家”(应用系统范围的阿拉伯数字)。现在转到java应用程序并在文本字段中键入数字。这个数字不是阿拉伯语,而是英语。这就是问题..

  

3 个答案:

答案 0 :(得分:5)

也许你可以试试这个(至少是为了寻找线索):

使用AWT TextField和Swing JTextField注册KeyListener,并在键盘上键入“1”时查看收到的内容。

然后,如果您获得不同的代码,您可以检查是否可以编写一个获取所有键的常规事件处理程序,并用阿拉伯语语言环境中的匹配代码替换键0-9。

不是一个完美的解决方案,但它可能有用。

答案 1 :(得分:4)

注意:这是问题的答案 - 只是带有代码段的评论

在SwingX中,我们有一个issue with NumberFormat not showing arabic digits。除了允许客户端代码访问JXMonthView的内部,因此他们可以手动调整用于数字的unicode范围,没有任何帮助:

    private void adjustFormatSymbols(Locale locale, DecimalFormat df) {
        if ("ar".equals(locale.getLanguage())) {
            DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
            // set the beginning of the range to Arabic digits
            dfs.setZeroDigit('\u0660');
            df.setDecimalFormatSymbols(dfs);
        }
    }

答案 2 :(得分:2)

这不是一个真正的答案,但这里有sscce可能暗示前进的方向。另请参阅Supported Locales

import java.awt.ComponentOrientation;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.util.Locale;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/questions/7886323 */
public class ArabicNumbers extends JPanel {

    private static final Locale arabic = new Locale("ar", "SA");
    private static final DecimalFormat format =
        (DecimalFormat) NumberFormat.getCurrencyInstance(arabic);
    private static final JFormattedTextField field =
        new JFormattedTextField(format);
    private ComponentOrientation arabicOrientation =
        ComponentOrientation.getOrientation(arabic);

    public ArabicNumbers() {
        this.setLayout(new GridLayout());
        format.setDecimalFormatSymbols(new DecimalFormatSymbols(arabic));
        field.applyComponentOrientation(arabicOrientation);
        field.setValue(123.45);
        this.add(field);
    }

    private void display() {
        JFrame f = new JFrame("ArabicNumbers");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

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

            @Override
            public void run() {
                new ArabicNumbers().display();
            }
        });
    }
}