gpt4 book ai didi

java - 如何通过按 Enter 清除 JTextArea 并保持在同一行

转载 作者:行者123 更新时间:2023-12-02 11:48:42 24 4
gpt4 key购买 nike

我试图在按 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) {
}
}

最佳答案

切勿将 KeyListener 添加到 JTextComponent(例如 JTextArea),因为这可能会破坏文本组件的基础功能。相反,当 Swing 库想要捕获组件上的击键时,请使用它所使用的内容:使用 Key Bindings .

例如,如果您将 Enter 键击绑定(bind)到清除 JTextArea 的操作,则您的代码将起作用。在下面的代码中,我们获取 JTextArea 具有焦点时的 InputMap:

int condition = JComponent.WHEN_FOCUSED;
InputMap inputMap = textArea.getInputMap(condition);

并获取 JTextArea 的 ActionMap

ActionMap actionMap = textArea.getActionMap();

然后我们将两个映射绑定(bind)在一起,我们使用相同的字符串常量绑定(bind)它们,这里我使用 .toString() 作为我的 KeyStroke,但是任何唯一的(当前未使用的) 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());
}
}

关于java - 如何通过按 Enter 清除 JTextArea 并保持在同一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48027469/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com