Java 如何按enter键清除JTextArea并保持在同一行上
我试图在按enter键后清除2行的JTextArea。 我设置了一个按键监听器,当按下enter键时触发;我使用setText,它会清除它,但我的问题是,它转到下一行,进入该区域的文本仍然由两行组成,但我只需要一行。我还试图设置插入符号,但它不起作用,它将插入符号放在第二行的开头。 这是监听器代码,我认为它足够了,因为这完成了所有的工作,如果您需要更多的代码,请告诉我Java 如何按enter键清除JTextArea并保持在同一行上,java,swing,jtextarea,Java,Swing,Jtextarea,我试图在按enter键后清除2行的JTextArea。 我设置了一个按键监听器,当按下enter键时触发;我使用setText,它会清除它,但我的问题是,它转到下一行,进入该区域的文本仍然由两行组成,但我只需要一行。我还试图设置插入符号,但它不起作用,它将插入符号放在第二行的开头。 这是监听器代码,我认为它足够了,因为这完成了所有的工作,如果您需要更多的代码,请告诉我 private class AscoltatoreKey implements KeyListener{ public
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) {
}
}
切勿将KeyListener添加到JTextComponent(如JTextArea),因为这会破坏文本组件的底层功能。相反,使用Swing库在希望捕捉组件上的关键点笔划时所使用的:use 例如,如果将enter键笔划绑定到清除JTextArea的操作,则代码将正常工作。在下面的代码中,我们得到了JTextArea的InputMap,它具有焦点时:
int condition = JComponent.WHEN_FOCUSED;
InputMap inputMap = textArea.getInputMap(condition);
并获得JTextArea的行动图
ActionMap actionMap = textArea.getActionMap();
然后我们将两个映射绑定在一起,我们使用相同的字符串常量绑定它们,这里我使用.toString作为我的击键,但是任何在当前InputMap字符串中未使用的唯一映射都可以。该操作只是清除导致该操作发生的JTextArea,即该操作的源:
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());
}
}
决不要将KeyListener添加到Swing文本组件。改为使用密钥绑定。请查看要回答的编辑。如果你对答案感到困惑,请回复。很抱歉,这是我第一次使用swing,所以我不知道焦点和这两张地图是什么,你能说得更详细一点吗?@Andreascop:请查看相关的文档,这将解释你的大部分困惑。好的,我想现在我已经理解了你写的大部分内容,但是为什么你要使用` KeyStroke enterKey=KeyStroke.getKeyStrokeKeyEvent.VK_ENTER,0;'和'新抽象动作'?在您发送的文档中,它使用一个字符串来指定键击,它没有创建任何对象作为值,而是使用javax.swing.Action对象。键击需要作为put的第一个参数进入InputMap。。。方法,并且它必须是击键对象,而不是字符串。此方法的第二个参数必须是字符串,并且必须是用于绑定到ActionMap的同一字符串。查找InputMap和ActionMap的API,研究它们各自的put。。。方法。另一个问题,这个“JTextArea txtArea=JTextArea e.getSource”是否必要?既然你知道该清除什么,你就不能只写“textArea.setText”吗?