0

しばらくの間、次のコードを使用して、Eclipse のオートコンプリートのような文字を JTextPane に挿入しようとしました。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.text.StyledDocument;

public class Main implements Runnable
{
private static final long serialVersionUID = 1L;
private static final int WIDTH = 800;
private static final int HEIGHT = 600;
private static final String NAME = "";
private JFrame frame;
private JTextPane textPane = new JTextPane();

public void run()
{
    frame = new JFrame(NAME);
    frame.setPreferredSize(new Dimension(WIDTH, HEIGHT));
    frame.setMinimumSize(new Dimension(WIDTH, HEIGHT));
    frame.setMaximumSize(new Dimension(WIDTH, HEIGHT));
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLayout(new BorderLayout()); 
    frame.add(textPane, BorderLayout.CENTER);
    textPane.setPreferredSize(new Dimension(WIDTH, HEIGHT));
    textPane.setEditable(true);
    textPane.addKeyListener(new KeyListener(){

                @Override
                public void keyPressed(KeyEvent arg0) {
                    ArrayList<Integer> keyCode = new ArrayList<Integer>();
                    StyledDocument doc = textPane.getStyledDocument(); 
                    keyCode.add(arg0.getKeyCode());
                    if(keyCode.contains(KeyEvent.VK_OPEN_BRACKET)) /* If an open brace has been hit! */
                    {
                        if(keyCode.contains(KeyEvent.VK_SHIFT)) /* Because brackets and braces use the same keyCode, we needed to 
                                                                 * make sure it was a brace */
                        {
                            try
                            {
                                doc.insertString(textPane.getCaretPosition(), "\n}", null); /* Putting in our new string */
                            } catch(Exception e1) {
                                e1.printStackTrace();
                            }
                            return;
                        }
                        /* Auto-complete it */
                        try
                        {
                            doc.insertString(textPane.getCaretPosition(), "]", null); /* Putting in our new string */
                        } catch(Exception e1) {
                            e1.printStackTrace();
                        }
                    }

                }

                @Override
                public void keyReleased(KeyEvent arg0) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void keyTyped(KeyEvent arg0) {
                    // TODO Auto-generated method stub

                }
    });
    frame.pack(); 
    frame.setVisible(true);



}

public void start()
{
    new Thread(this).start();
}

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

}

これに関して私が抱えている唯一の問題は、insertString のオフセットが列ではなく行であるように見えることです。たとえば、insertString のオフセットを 0 に設定しようとすると、入力された文字の後ろに文字が配置されるため、次のようになります。

)(

これの私の望ましい出力の代わりに:

()

ただし、オフセットを 1 に設定すると、行全体が下がり、次のようになります。

(
)

ここで何が起こっているのか、またはsetText を使用する以外にテキストを挿入する方法がわかりません。

何か案は?setText のみを使用する運命にありますか? いつもありがとうございます!

〜セント

編集:

コードを SSCCE に変更しました。

4

0 に答える 0