2012-04-22 58 views
3

我有一個在特定設置下不可編輯的JTextArea。但是,在此設置下,用戶仍然可以使用空格和退格鍵。爲了容納這個空間,我有以下代碼,Java在不可編輯的JTextArea中插入退格鍵

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

雖然我遇到了退格問題。我試過這個,

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

這似乎是當按下退格鍵時添加一個小空間。它不如空間,當按下一次時它幾乎不會被察覺。這絕對不是一個退格。更糟糕的情況下,我必須將所有字符複製到插入位置 - 1並將它們附加到插入位置後面的所有字符,但我不喜歡該解決方案。

+0

只是看着我寫了前段時間的接口,我用(如你所說)**如果(!s.equals( 「」)),S = s.substring (0,s.length() - 1); **(我的界面不需要克拉)另外:我不知道JTextArea是否爲您處理它,但您可能需要注意Alt,Tab,Escape ,控制等(沒有被** KeyEvent.isActionKey()**捕獲的任何東西都會導致插入一個小空格(一個不可打印的字符) – lynks 2012-04-22 00:48:12

回答

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(); 
     } 
     } 
    } 
} 
+0

感謝它的工作,不幸的是,由於textarea是不可編輯的,在Windows上惱人的高調聲音,告訴你你正試圖編輯一些不可編輯的東西,你會不會知道如何擺脫它,是嗎? – gsingh2011 2012-04-22 04:43:44

+0

@ gsingh2011:不客氣。我上面的代碼適用於我,並且我沒有聽到這個聲音,所以我不能提供任何建議,直到我能夠以某種方式重現此問題。考慮創建併發佈一個[sscce](http://sscce.org),類似於我在上面發佈的內容,重現此問題,然後對我發表評論,然後我會查看它。 – 2012-04-22 13:55:41

相關問題