2

このイベントを以下で呼び出そうとしています。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();
        }
    }
}
4

1 に答える 1

3

あなたはこれを書きます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);

KeyBinding の使用方法

于 2013-07-10T14:39:47.867 に答える