3

特定の設定では編集できないJTextAreaがあります。ただし、この設定では、ユーザーは引き続きスペースキーとバックスペースキーを使用できます。スペースを収容するために、私は次のコードを持っています、

if (e.getKeyChar() == KeyEvent.VK_SPACE) {
    editor.insert(" ", editor.getCaretPosition());
}

ただし、バックスペースに問題があります。私はこれを試しました、

if (e.getKeyChar() == KeyEvent.VK_BACK_SPACE) {
    editor.insert("\b", editor.getCaretPosition());
}

バックスペースを押すと、小さなスペースが追加されるようです。スペースほどではなく、一度押すとほとんど目立たなくなります。しかし、それは間違いなくバックスペースではありません。最悪の場合、すべての文字をカレット位置-1までコピーし、カレット位置の後のすべての文字に追加する必要がありますが、その解決策は好きではありません。

4

1 に答える 1

3

キーバインドを使用して、スペースキーとバックスペースキーにアクションを関連付け、バックスペースが押されている場合はJTextAreaのドキュメントから文字を削除します。

例えば、

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.*;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

@SuppressWarnings("serial")
public class TextAreaFun extends JPanel {
   public static final String SPACE = "space";
   public static final String BACK_SPACE = "back space";
   private JTextArea textArea = new JTextArea(15, 50);

   public TextAreaFun() {
      // create our key bindings
      // only allow key presses to initiate an action if the JTextArea has focus
      int condition = JComponent.WHEN_FOCUSED;
      InputMap taInputMap = textArea.getInputMap(condition);
      ActionMap taActionMap = textArea.getActionMap();

      taInputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), SPACE);
      taInputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0),
            BACK_SPACE);
      taActionMap.put(SPACE, new KeyAction(textArea, SPACE));
      taActionMap.put(BACK_SPACE, new KeyAction(textArea, BACK_SPACE));

      // checkbox that stops all editing except for that specified in the 
      // key bindings above
      JCheckBox chkBox = new JCheckBox(new AbstractAction("Prevent Editing") {
         {
            putValue(SELECTED_KEY, Boolean.FALSE); // default to unchecked
            putValue(MNEMONIC_KEY, KeyEvent.VK_P);
         }

         @Override
         public void actionPerformed(ActionEvent evt) {
            boolean selection = (Boolean) getValue(SELECTED_KEY);
            textArea.setEditable(!selection);
         }
      });
      JPanel bottomPanel = new JPanel();
      bottomPanel.add(chkBox);

      setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
      add(new JScrollPane(textArea));
      add(Box.createVerticalStrut(10));
      add(bottomPanel);
   }

   private static void createAndShowGui() {
      TextAreaFun mainPanel = new TextAreaFun();

      JFrame frame = new JFrame("TextAreaFun");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

@SuppressWarnings("serial")
// action to be initiated by key bindings
class KeyAction extends AbstractAction {
   private PlainDocument textAreaDocument;
   private String title;

   public KeyAction(JTextArea textArea, String title) {
      this.textAreaDocument = (PlainDocument) textArea.getDocument();
      this.title = title;
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      if (title.equals(TextAreaFun.SPACE)) {
         try {
            textAreaDocument.insertString(textAreaDocument.getLength(), " ",
                  null);
         } catch (BadLocationException e1) {
            e1.printStackTrace();
         }
      } else if (title.equals(TextAreaFun.BACK_SPACE)) {
         if (textAreaDocument.getLength() == 0) {
            return;
         }
         try {
            textAreaDocument.remove(textAreaDocument.getLength() - 1, 1);
         } catch (BadLocationException e1) {
            e1.printStackTrace();
         }
      }
   }
}
于 2012-04-22T01:06:14.320 に答える