java - JTextField Text-Not-Fitting渲染错误(解决方法)

时间:2018-01-11 08:54:50

标签: java swing rendering custom-controls jtextfield

在RIGHT_TO_LEFT组件方向上呈现错误文本的JTextField

我们确实需要解决方法,因为JTextField填充了包含以下内容的文字:

  

Right to left text,例如阿拉伯语,Latin numbersLatin text

然后JTextField在意外的位置呈现文字部分

  

只有在JTextField

内的完整文本适合时才会向右呈现

我们用来复制的文字是:

  • صندوق ۴۰×۳۰ پایه دار وایرنگ میتر تک فاز

其他信息

  • 上面的文字只是我们创建的会计软件中添加的产品的名称,但是我们的用户可以匹配更多的渲染失败,因为我们可以重现。
  • 我们在JDK-8194733
  • 报告
  • 我们没有使用java自定义渲染的经验来制作解决方法,但渲染整个文本而不考虑应该这样做的限制和裁剪

可执行测试用例的源代码:

//
//like you see below code shows simple JTextField but
//  once you resize the window smaller than the text Fits 
//  you experience dancing numbers
//  but try to select part of text that is more fatal
//
//other info: below text is just name of a product added inside an accounting software
//  we created but our users have match more render failures as we could reproduce.
//
package test;

import java.awt.ComponentOrientation;

public class JavaBug extends javax.swing.JFrame {

    public static void main(String[] args) {
        JavaBug frame = new JavaBug();
        frame.show();
    }

    public JavaBug() {
        javax.swing.JTextField textField = new javax.swing.JTextField();

        textField.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
        textField.setText("\u0635\u0646\u062F\u0648\u0642 \u06F4\u06F0×\u06F3\u06F0 \u067E\u0627\u06CC\u0647 \u062F\u0627\u0631 \u0648\u0627\u06CC\u0631\u0646\u06AF \u0645\u06CC\u062A\u0631 \u062A\u06A9 \u0641\u0627\u0632");
        textField.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

        getContentPane().add(textField);
        pack();
        this.setLocationRelativeTo(null); //enusre get showed at screen center
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    }
}

屏幕截图:just runafter resize

开发套件或运行时版本:

  • java版本" 1.8.0_25"
  • Java(TM)SE运行时环境(版本1.8.0_25-b18)
  • Java HotSpot(TM)客户端VM(版本25.25-b02,混合模式)

1 个答案:

答案 0 :(得分:2)

你可以试试这个

import javax.swing.*;
import javax.swing.text.html.HTMLEditorKit;
import java.awt.*;

public class JavaBug extends javax.swing.JFrame {

    public static void main(String[] args) {
        JavaBug frame = new JavaBug();
        frame.show();
    }

    public JavaBug() {
        JTextPane textPane = new JTextPane();
        textPane.setEditorKit(new HTMLEditorKit());
        textPane.setText("<html><font size='+2'>\u0635\u0646\u062F\u0648\u0642 \u06F4\u06F0×\u06F3\u06F0 \u067E\u0627\u06CC\u0647 \u062F\u0627\u0631 \u0648\u0627\u06CC\u0631\u0646\u06AF \u0645\u06CC\u062A\u0631 \u062A\u06A9 \u0641\u0627\u0632</font></html>");
        textPane.getDocument().putProperty("i18n", Boolean.TRUE);
        JPanel noWrapPanel = new JPanel( new BorderLayout() );
        noWrapPanel.add( textPane );
        JScrollPane scrollPane = new JScrollPane( noWrapPanel );
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);

        /* without below right to left force there is an other bug when we press home and
         * try to navigate to end using left key it will never get at end and fall back at start. kind of crazy bug */
        java.util.Locale arabic = new java.util.Locale("ar", "KW");
        ComponentOrientation arabicOrientation = ComponentOrientation.getOrientation(arabic);
        textPane.applyComponentOrientation(arabicOrientation);

        getContentPane().add(scrollPane);
        pack();
        this.setLocationRelativeTo(null); //enusre get showed at screen center
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    }
}