しばらくの間、次のコードを使用して、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 に変更しました。