JFrame 内のフォーカスに関係なく、すべての を 1 つの特定の に再ディスパスするKeyboardFocusManager
独自のカスタムをいじっています。これは、テキスト入力に関する限り魅力的に機能しますが、 a が再ディスパッチされたときに、がそのテキストを a に投稿することも望んでいます。何らかの理由で、これを行うことはできません。テキスト フィールドにカーソルを置いて ENTER を押すと発生する actionListener を設定しましたが、ENTER イベントが.KeyEventDispatcher
KeyEvent
JTextField
JTextField
JTextArea
KeyEvent.VK_ENTER
JTextField
KeyboardFocusManager.redispatchEvent(keyEvent)
また、Enter キーが押された場合に、変更されていない KeyEvent ではなく ActionEvent を再ディスパスしようとしましたが、役に立ちませんでした :( ActionEvent をコンポーネントにディスパスすると、ActionListeners が起動すると思うかもしれませんが、違います。
誰かがこれがなぜなのか説明できますか? そして、それをうまく回避する方法を提案しますか?
SSCCE:
package viewlayer.guiutil.focus;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.Runnable;import java.lang.String;
import java.util.Date;
public class Test extends JFrame
{
private JTextField m_chatInput;
private JTextArea m_textArea;
public static void main(String... args)
{
Test test1 = new Test();
test1.run(test1);
}
public void run(final Test test)
{
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
test.setSize(250, 400);
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new MyKeyEventDispatcher());
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
test.init();
}
});
test.setVisible(true);
}
public void init()
{
JPanel panel = new JPanel (new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(2,5,1,1);
gbc.weightx = 1.0;
gbc.anchor = GridBagConstraints.WEST;
gbc.gridwidth = GridBagConstraints.REMAINDER;
JLabel chatLabel = new JLabel("Chat input field:");
panel.add(chatLabel,gbc);
m_chatInput = new JTextField(15);
m_chatInput.setActionCommand(MyActionListener.ACTION_PERFORMED);
m_chatInput.addActionListener(new MyActionListener());
panel.add(m_chatInput,gbc);
JTextField chatInput = new JTextField(15);
panel.add(chatInput,gbc);
JLabel text = new JLabel("chat history:");
panel.add(text,gbc);
m_textArea = new JTextArea(5, 15);
m_textArea.setFocusable(false);
panel.add(m_textArea,gbc);
JButton postButton = new JButton("Post");
postButton.setActionCommand(MyActionListener.ACTION_PERFORMED);
postButton.addActionListener(new MyActionListener());
panel.add(postButton,gbc);
gbc.weighty = 1.0;
gbc.anchor = gbc.NORTHWEST;
setLayout(new FlowLayout(FlowLayout.LEFT));
add(panel);
}
private class MyKeyEventDispatcher implements KeyEventDispatcher
{
public boolean dispatchKeyEvent(KeyEvent keyEvent)
{
KeyboardFocusManager.getCurrentKeyboardFocusManager().redispatchEvent(m_chatInput, keyEvent);
return false;
}
}
private class MyActionListener implements ActionListener
{
private static final String ACTION_PERFORMED = "ACTION_PERFORMED";
public void actionPerformed(ActionEvent actionEvent)
{
if(actionEvent.getActionCommand().equals(ACTION_PERFORMED))
{
Date date = new Date(System.currentTimeMillis());
m_textArea.append(date.getHours() +":"+ date.getMinutes() +":"+ date.getSeconds() + " - " + m_chatInput.getText() + "\n");
m_chatInput.setText("");
}
}
}
}