我有一個Java Swing應用程序,它有許多JTextField和一個數據模型。在模型上使用JTextField(在focusLost上)並使用模型數據運行Actions
當離開文本字段(焦點丟失)時,文本被寫入模型。到現在爲止還挺好。
有JMenu-Actions從模型讀取數據並將其發送到服務器。
問題是,當它的加速器運行菜單動作時,不會觸發「焦點丟失」。所以動作讀取並傳輸來自數據模型的舊值。 。
可能有很多方法可以解決這個問題......?你有建議如何解決這個問題?
什麼不爲我工作:
- 寫上每一個按鍵進行建模(通過文檔偵聽):不使用,應該只留下寫文本框(焦點丟失)。文本在寫入模型之後(昂貴)評估 - 每次按鍵後都無法運行。
- 在每個動作中處理寫作模型。有約。 500個Textfields和ca. 100項行動。在不忘記任何事情的情況下進行比賽。
Runnable的演示代碼:
package swingmodel;
import java.awt.FlowLayout;
import java.awt.event.*;
import javax.swing.*;
/**
* Simple Demo Problem. Enter a Text in the first Textfield and press ALT-T. The
* focus listener did no run, therefore the old value from model is displayed.
*/
public class TextDemoOnMenu extends JPanel {
private Model model;
public TextDemoOnMenu() {
super(new FlowLayout());
model = new Model();
MyTextField textField = new MyTextField(20, model);
add(textField);
add(new JTextField(5));
}
class MyTextField extends JTextField {
private Model model;
public MyTextField(int arg, Model model) {
super(arg);
this.model = model;
addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
System.out.println("focus lost");
writeToModel();
}
});
}
public void writeToModel() {
this.model.setText(getText());
}
}
class ShowModelTextAction extends AbstractAction {
public ShowModelTextAction(String string) {
super(string);
}
@Override
public void actionPerformed(ActionEvent e) {
String message = "text is: " + model.getText();
JOptionPane.showMessageDialog(TextDemoOnMenu.this, message);
}
}
class Model {
private String text;
void setText(String t) {
text = t;
}
public String getText() {
return text;
}
}
private void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("TextDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Add contents to the window.
frame.add(this);
Action action = new ShowModelTextAction("show text");
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("My Menu");
menuBar.add(menu);
JMenuItem menuItem = new JMenuItem("show text");
menuItem.setAction(action);
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, ActionEvent.ALT_MASK));
menu.add(menuItem);
frame.setJMenuBar(menuBar);
// Display the window.
frame.setSize(400, 200);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new TextDemoOnMenu().createAndShowGUI();
}
});
}
}
謝謝,這有幫助! ;) – Synox 2011-01-28 09:42:27