我在按Enter键后尝试清除2行的JTextArea。
我设置了一个KeyListener,当按下该键时,它会触发;我使用setText("")
并清除它但我的问题是它转到下一行,并且该区域的文本仍由2行构成,但我只想要一行。我也尝试设置插入符但它不起作用,它将插入符号放在第二行的开头。
这是听众代码,我认为它足够了,因为这可以完成所有工作,以防您需要更多代码让我知道。
private class AscoltatoreKey implements KeyListener{
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER){ //viene azionato quando viene premuto invio
String espressione = input.getText().trim(); //prendo il testo dall'area di input
valutatore.addEspressione(espressione); //aggiungo l'espressione al valutatore
numeroEspressioni++;
areaEquazioni.append(numeroEspressioni + ") " + espressione +"\n"); //scrivo l'espressione nella lista delle espressioni
try{
areaSoluzioni.append(numeroEspressioni + ") " + valutatore.risolvi() + "\n"); //scrivo l'espressione nella lista delle soluzioni
}catch (Exception exc){
areaSoluzioni.append(numeroEspressioni + ") " + "Espressione malformata!" + "\n");
}
input.setText(""); //svuoto l'area di input per prepararmi a ricevere la nuova espressione
input.setCaretPosition(0);
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
}
答案 0 :(得分:1)
永远不要将KeyListener添加到JTextComponent,例如JTextArea,因为这会破坏文本组件的基础功能。而是使用Swing库在想要捕获组件上的键击时使用的内容:使用Key Bindings。
例如,如果将Enter键笔划绑定到清除JTextArea的Action,则代码将起作用。在下面的代码中,我们得到了JTextArea的InputMap,它具有焦点:
int condition = JComponent.WHEN_FOCUSED;
InputMap inputMap = textArea.getInputMap(condition);
并获取JTextArea的ActionMap
ActionMap actionMap = textArea.getActionMap();
然后我们将两个映射绑定在一起,我们使用相同的String常量绑定它们,这里我使用.toString()
作为我的KeyStroke,但任何唯一的(当前的InputMap中也没有使用的)字符串都可以。该操作只是清除导致操作发生的JTextArea(Action的来源):
KeyStroke enterKey = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
inputMap.put(enterKey, enterKey.toString());
actionMap.put(enterKey.toString(), new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
JTextArea txtArea = (JTextArea) e.getSource();
txtArea.setText("");
}
});
我在上面的完整MCVE示例:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class ClearTextAreaEg extends JPanel {
private JTextArea textArea = new JTextArea(10, 20);
public ClearTextAreaEg() {
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
int condition = JComponent.WHEN_FOCUSED;
InputMap inputMap = textArea.getInputMap(condition);
ActionMap actionMap = textArea.getActionMap();
KeyStroke enterKey = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
inputMap.put(enterKey, enterKey.toString());
actionMap.put(enterKey.toString(), new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
JTextArea txtArea = (JTextArea) e.getSource();
txtArea.setText("");
}
});
setLayout(new BorderLayout());
add(new JScrollPane(textArea));
}
private static void createAndShowGui() {
ClearTextAreaEg mainPanel = new ClearTextAreaEg();
JFrame frame = new JFrame("ClearTextAreaEg");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}