在 JTextArea 中附加点(“.”),方向从右到左

Appending point (".") in JTextArea with rigth to left orientation

我在 Java (1.7 JRE) 中遇到了异常问题,我找不到解决方案。

我正在使用 JTextArea 以十进制数的形式在其中写入文本,例如从右到左方向的 123.4。每次我输入“。” in 出现在文本的开头,例如 .123,当我输入下一个数字时,它应该显示为 123.4

当我尝试使用键盘输入数字和使用我编写的方法通过 JButtons 输入数字时,都会发生这种情况。这是代码的一部分:

        String number;
        JTextArea textAreaUnos;
        .
        .
        .
        number=number+".";
        textAreaUnos.setText(number);

我也试过这样写:

textAreaUnos.append(".");

但是我输入的结果是一样的,例如

123
.123
123.4

在从左到右的方向上,不会发生这种情况。

有没有人遇到过这样的问题,你们解决了吗?

确实,当您附加 RIGHT_TO_LEFT 以非数字或字母开头或结尾的字符串时,输出是错误的(即 123。被转换为 .123)

我设法通过检查字符是否为 .isLetterOrDigit 来正确附加它,并根据检查附加到开始或结束。我知道这很棘手,但这是我找到的唯一解决方案。

主要:

import java.awt.ComponentOrientation;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Main extends JFrame {
  /**
     * 
     */
    private static final long serialVersionUID = 1L;

private JTextArea t1 = new JTextArea("", 10, 15), t2;

  public Main() {
    Box b = Box.createHorizontalBox();    
    b.add(new JScrollPane(t1));    
    t2 = new JTextArea(10, 15);
    t2.setEditable(false);
    b.add(new JScrollPane(t2));
    add(b); 
    setSize(425, 200);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    t2.setComponentOrientation ( ComponentOrientation.RIGHT_TO_LEFT); 

    t1.addKeyListener ( new KeyListener( )
    {

        @Override
        public void keyTyped ( KeyEvent e )
        {
        }

        @Override
        public void keyReleased ( KeyEvent e )
        {
            char check = (char)e.getKeyCode ( );
            if(Character.isLetterOrDigit ( check ) )
            {
                t2.setText ( t1.getText ( ).substring ( 0 , t1.getText ( ).length ( )-1 ) + check);

            }
            else 
            {
                t2.setText ( check + t2.getText ( ) );
            }

        }

        @Override
        public void keyPressed ( KeyEvent e )
        {

        }
    });
  }
  public static void main(String args[]) {
    new Main();
  }
}

测试:

一种解决方法是使用 JTextPaneJEditorPane。以下是 JTextPane.

的示例
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JTextPane;

import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

class Demo{
    public static void main(String[]args){
        SwingUtilities.invokeLater(()->{
            JFrame frame=new JFrame("Right-Left");
            JTextPane box=new JTextPane();
            frame.getContentPane().add(box);
            SimpleAttributeSet attr = new SimpleAttributeSet();
            StyleConstants.setAlignment(attr, StyleConstants.ALIGN_RIGHT);
            box.setParagraphAttributes(attr, true);
            frame.setSize(300,200);
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        });
    }
}