2013-10-24 31 views
2

我正在開發一個聊天應用程序,當我在按住一個輸入按鈕對焦JTextArea時,我希望它停止添加不必要的新文本行,例如,我將能夠確定當用戶按下輸入按鈕並且沒有在JTextArea內輸入任何內容時。我使用KeyListener來檢測用戶何時釋放回車鍵併發送消息。我首先嚐試用空字符串message.replaceAll(「[\ n]」,「」)替換新的文本行,並修剪消息,但它不起作用。有什麼我在做我的方法錯了,還是會有任何其他的解決方案,我可以適應?JTextArea按Enter鍵添加不必要的新行

+0

改爲使用JTextField。 –

回答

4
  • 請勿爲此使用JTextArea,而應使用JTextField。
  • 然後,您可以通過給JTextField一個ActionListener輕鬆地監聽輸入新聞。
  • 我見過的大多數Swing聊天應用程序都使用了兩個文本組件:一個用於顯示傳入文本和發送文本的JTextArea以及一個用於允許用戶輸入文本的JTextField。
  • 通常一個使用BorderLayout在另一個之上。


  • 如果你絕對必須使用一個JTextArea,那麼你可能需要使用密鑰綁定捕捉回車鍵和處理。檢查出How to use Key Bindings Tutorial


例如:

示例鍵綁定解決方案:

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

import javax.swing.*; 

@SuppressWarnings("serial") 
public class CaptureTextAreaEnter extends JPanel { 
    private static final int COLS = 30; 
    private static final int VIEW_ROWS = 12; 
    private static final int ENTER_ROWS = 4; 
    private JTextArea chatViewArea = new JTextArea(VIEW_ROWS, COLS); 
    private JTextArea chatEnterArea = new JTextArea(ENTER_ROWS, COLS); 

    public CaptureTextAreaEnter() { 
     setLayout(new BorderLayout()); 
     add(new JScrollPane(chatViewArea), BorderLayout.CENTER); 
     add(new JScrollPane(chatEnterArea), BorderLayout.SOUTH); 

     chatViewArea.setFocusable(false); 

     chatViewArea.setWrapStyleWord(true); 
     chatEnterArea.setWrapStyleWord(true); 
     chatViewArea.setLineWrap(true); 
     chatEnterArea.setLineWrap(true); 

     // start our set up of key bindings 

     // to get the correct InputMap 
     int condition = WHEN_FOCUSED; 
     // get our maps for binding from the chatEnterArea JTextArea 
     InputMap inputMap = chatEnterArea.getInputMap(condition); 
     ActionMap actionMap = chatEnterArea.getActionMap(); 

     // the key stroke we want to capture 
     KeyStroke enterStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); 

     // tell input map that we are handling the enter key 
     inputMap.put(enterStroke, enterStroke.toString()); 

     // tell action map just how we want to handle the enter key 
     actionMap.put(enterStroke.toString(), new AbstractAction() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      String text = chatEnterArea.getText(); 
      chatEnterArea.setText(""); 
      chatViewArea.append(text + "\n"); 

      // *** you will want to send text to your 
      // *** PrintStream to the chat server here 
     } 
     }); 
    } 

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

     JFrame frame = new JFrame("CaptureTextAreaEnter"); 
     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(); 
     } 
     }); 
    } 
} 
+0

好的謝謝你的回答,但是我已經注意到JTextField將不允許換行,我怎樣才能將這個功能返回到文本字段? – Adrian

+0

我真的想保持滾動垂直+線包裹,否則,如果這是不可能的,我可能會尋求解決方案JTextArea – Adrian

+0

@Adrian:請參閱編輯回答。 –

-1

要替換的 「輸入」 的標準行爲的關鍵,你應該使用的輸入/行動地圖您的文本區域

請參閱方法registerKeyboardAction(ActionListener anAction,String aCommand,KeyStroke aKeyStroke,int aCondition)。作爲行動監聽者,您應該從您的「發送」按鈕中執行操作,命令是您的選擇的字符串,關鍵行程爲KeyStroke.getKeyStroke(KeyEvent.VK_ENTER),條件爲JComponent.WHEN_FOCUSED

+0

我不同意你的建議以查看'registerKeyboardAction'方法。根據[JComponent API](http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html):''此方法現在已過時,請使用getActionMap()和getInputMap()類似的行爲。「再次更好地使用標準鍵綁定按照我的答案。 –

+0

爲什麼?此方法在內部使用輸入/動作映射。 –

+0

該方法可能正在成爲過時的方式。至於爲什麼,我不知道。您將希望與Java和Swing的開發人員和維護人員討論此問題。他們是把這個評論放在Java API中的人,而不是我。 –