我正在嘗試模擬將文本添加到JTextField代碼中。我這樣做是為了自動對用戶輸入文本時發生的情況進行單元測驗。
我已經嘗試過下面顯示的方法,該方法適用于其他模擬,但不適用于JTextField. 我怎樣才能使下面的代碼actionPerformed像在 GUI 中一樣輸入方法?
public class Main {
public static void main(String[] args) {
RemoteGUI remoteGUI = new RemoteGUI();
ActionEvent event = new ActionEvent(remoteGUI.getTextField(), ActionEvent.ACTION_PERFORMED, "50");
remoteGUI.getTextField().dispatchEvent(event);
System.out.println("Expected to perform action but didn't");
}
}
class RemoteGUI extends JFrame {
JTextField textField;
public RemoteGUI() {
JPanel panel = new JPanel();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setSize(600, 250);
panel.setLayout(null);
this.add(panel);
Font font = new Font("Verdana", Font.BOLD, 28);
JLabel label = new JLabel("Enter A Number");
label.setFont(font);
label.setBounds(10,20,300,50);
panel.add(label);
textField = new JTextField("");
textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String velocity = textField.getText();
System.out.println("Velocity " velocity " entered into GUI");
}
});
textField.setFont(font);
textField.setBounds(320,20,200,50);
panel.add(textField);
this.setVisible(true);
}
public JTextField getTextField(){
return textField;
}
}
uj5u.com熱心網友回復:
不要使用dispatchEvent(event). 相反,使用postActionEvent(). 同樣,對于按鈕和選單項,您應該使用doClick(). 在發送事件之前,您還應該先在欄位上設定文本。
通常,使用布局管理器而不是處理絕對坐標,并且不要不必要地子類化組件類(如JFrame您的情況)。
例如
public class Main {
public static void main(String[] args) {
RemoteGUI remoteGUI = new RemoteGUI();
JTextField tF = remoteGUI.getTextField();
tF.setText("50");
tF.postActionEvent();
}
}
class RemoteGUI {
JTextField textField;
RemoteGUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Box panel = Box.createHorizontalBox();
panel.setBorder(BorderFactory.createEmptyBorder(8, 10, 8, 10));
Font font = new Font("Verdana", Font.BOLD, 28);
JLabel label = new JLabel("Enter A Number");
label.setFont(font);
panel.add(label);
panel.add(Box.createHorizontalStrut(20));
textField = new JTextField(10);
textField.addActionListener(e -> {
String velocity = textField.getText();
System.out.println("Velocity " velocity " entered into GUI");
});
textField.setFont(font);
panel.add(textField);
label.setLabelFor(textField);
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
}
JTextField getTextField() {
return textField;
}
}
而且,由于您為數字創建了一個文本欄位,您可以考慮使用 aJFormattedTextField來代替。
uj5u.com熱心網友回復:
不是完整的答案,而是更多資訊。
以下代碼有效:
- 當框架可見時
- 你點擊按鈕
- 使用 KeyEvent 代替 ActionEvent。
代碼:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Main6 {
public static void main(String[] args) {
SwingUtilities.invokeLater(() ->
{
RemoteGUI remoteGUI = new RemoteGUI();
// Doesn't work (maybe add a Timer here to invoke this code after a few ms once the frame is displayed?
//ActionEvent event = new ActionEvent(getTextField(), ActionEvent.ACTION_PERFORMED, "50");
KeyEvent event = new KeyEvent(remoteGUI.getTextField(), KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, KeyEvent.VK_ENTER, KeyEvent.CHAR_UNDEFINED);
remoteGUI.getTextField().dispatchEvent(event);
});
}
}
class RemoteGUI extends JFrame {
JTextField textField;
public RemoteGUI() {
JPanel panel = new JPanel();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Font font = new Font("Verdana", Font.BOLD, 28);
JLabel label = new JLabel("Enter A Number");
label.setFont(font);
panel.add(label);
textField = new JTextField(10);
textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String velocity = textField.getText();
System.out.println("Velocity " velocity " entered into GUI");
}
});
textField.setFont(font);
panel.add(textField);
JButton button = new JButton("Click Me");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//ActionEvent event = new ActionEvent(getTextField(), ActionEvent.ACTION_PERFORMED, "50");
KeyEvent event = new KeyEvent(getTextField(), KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, KeyEvent.VK_ENTER, KeyEvent.CHAR_UNDEFINED);
getTextField().dispatchEvent(event);
}
});
panel.add(button);
this.add(panel);
pack();
this.setVisible(true);
}
public JTextField getTextField(){
return textField;
}
}
但是,在 main() 方法中執行代碼時,KeyEvent 仍然不起作用。因此,一定存在某種時間問題,GUI 組件不可見。因此,也許您可??以使用 Timer 來安排代碼在幾毫秒后執行,以便讓 GUI 有時間顯示?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/504755.html
