和平在你们身上。
javas.swing.JTextField不支持输入等阿拉伯语,希伯来语,中文等其他语言的数字。我已经研究了很多,但我找不到解决方案。
我真的需要功能,因为我的整个应用程序都基于Javax.swing组件。
需要解决方案的人!!!
将JTextField放在简单的纯GUI上。转到区域设置并选择阿拉伯语(saudia arabia)作为区域设置,并将“数字替换”自定义为“国家”(应用系统范围的阿拉伯数字)。现在转到java应用程序并在文本字段中键入数字。这个数字不是阿拉伯语,而是英语。这就是问题..
答案 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();
}
});
}
}