【问题标题】:Event call doesn't work with key bind or click - what's the logical error?事件调用不适用于键绑定或单击 - 逻辑错误是什么?
【发布时间】:2013-07-08 13:04:11
【问题描述】:

我正在尝试在下面调用此事件;我使用 TabBuilder 创建框架(因为它是我的应用程序的一部分),然后它调用弹出的搜索屏幕;但是使用键绑定或简单单击按钮的搜索事件不起作用,当然我做错了,但我不知道是什么,因为我对 Java 有点陌生。请问谁能帮帮我?


搜索屏幕:


public class SearchScreen extends EventSearch{
    
    public static void main (String[] args){
    
        SearchScreen s= new SearchScreen();
    }
    
    public void SearchScreen(){
    
        TabBuilder tb = new TabBuilder();
          tb.searchTab();       
    }
}

事件搜索:


public class EventSearch extends TabBuilder{
    String userQuery;
    String key = "ENTER";
    KeyStroke keyStroke = KeyStroke.getKeyStroke(key);
    
    public EventSearch(){
    
        btSearch.addActionListener(this);
        txtSearch.getInputMap().put(keyStroke, key);
        txtSearch.getActionMap().put(key, enterAction);
    }
    
    Action enterAction = new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
        try{
            System.out.println("worked");
                } catch (IOException e1) {
                    e1.printStackTrace(); //print failure
                    JOptionPane.showMessageDialog(null, "HTTP request failure.");
                }   
            }
        };
     }

标签生成器:


public class TabBuilder implements ActionListener {

    protected JButton btSearch;
    JMenuItem close, search;
    protected JTextField txtSearch;
    protected JFrame searchFrame = new JFrame();
    
    public void TabBuilder(){
    }
    
    public void searchTab(){
    
        JLabel lbSearch;
        JPanel searchPane;
        
        btSearch= new JButton("Search");
        lbSearch= new JLabel("Type Keywords in english to be searched below:");
        lbSearch.setHorizontalAlignment(SwingConstants.CENTER);
        txtSearch= new JTextField();
        searchPane=new JPanel();
        searchPane.setBackground(Color.gray);
        searchPane.add(lbSearch);
        searchPane.add(txtSearch);
        searchPane.add(btSearch);
        searchPane.setLayout(new GridLayout(3,3));
        btSearch.setEnabled(true);
        searchFrame.add(searchPane);
        searchFrame.setTitle("SHST");
        searchFrame.setSize(400, 400);
        searchFrame.setVisible(true);
        searchFrame.setDefaultCloseOperation(1);
    }
    
    public void actionPerformed(ActionEvent e){
        if(e.getSource()==close){
            System.exit(0);
        }
        if(e.getSource()==search){
            SearchScreen s = new SearchSreen();
        }
    }
}

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2) 对代码块使用一致且符合逻辑的缩进。代码的缩进是为了帮助大家理解程序流程!
  • 其实我并没有读完所有的代码,而是只读了main,你有一个与构造函数签名相同的方法(void差异)并且永远不会被调用..
  • @AndrewThompson 抱歉,但我删除了所有我可以删除的内容,而且示例没有意义 - 如果您不同意建议编辑,因此我可以更正它。
  • “我尽可能地删除了所有内容” SSCCE 不仅仅是让它变得“短”。尝试实际阅读这篇文章,并注意,SSCCE 很容易超过 123 行,然后许多人会指责您发布的代码不“短”。说到这一点:源代码中的一个空白行总是就足够了。
  • @nachokk 你能说得更具体点吗?我无法完全理解你 - 谢谢

标签: java swing events awt actionevent


【解决方案1】:

你写这个actionListener

public void actionPerformed(ActionEvent e){
            if(e.getSource()==close){
                System.exit(0);
        }

            if(e.getSource()==search){
                TabBuilder tb = new TabBuilder();
                tb.searchTab();

            }
        }

如果您添加到 btnSearch.addActionListener(this) ,您的 actionListener 将永远不会做任何事情。

对于您的KeyBinding 发生类似的事情,您将操作添加到txtSearch,然后您询问来源是否是e.getSource()==btSearch

对于KeyBindings,您可以使用常量来指定何时必须绑定它们。 JComponent.WHEN_FOCUSEDJComponent.WHEN_IN_FOCUSED_WINDOWJComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT

例如:

txtSearch.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, key);

How to use KeyBindings

【讨论】:

  • +1,在我看来,这些也是问题背后的真正问题:-)
  • 我忘记更改 TabBuilder 上的那个小错误,我这样做是为了运行一个测试并忘记删除 - 它调用了 searchTab 两次;但是我仍然缺少事件的一部分-我删除了 btSearch.addActionListener(this);因为你是对的,所以按钮没有监听器,但即使删除 e.getSource(); 后 keyBind 仍然不起作用;
  • @VictorOliveira : 请重新编辑你的帖子,对不起,我的编辑与你的同时发生了冲突,如果结果不是你想要的,请重新编辑!!!
  • @nIcEcOw 据我所知,上面的重新编辑是我的,我做的最后一个,如果你愿意,你可以重新编辑
  • @VictorOliveira 你的问题中仍然有相同的代码......而且这种方法也没用public void SearchScreen(){ TabBuilder tb = new TabBuilder(); tb.searchTab(); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 2021-07-23
  • 1970-01-01
相关资源
最近更新 更多