如何修复此ActionListener以将String传递回窗口小部件

时间:2013-02-15 03:19:12

标签: java actionlistener jtextfield jtextarea

我是Java的新手,只是练习ActionListeners。作为我工作的应用程序的一部分,我将有一个JTextField让用户搜索一个名称,然后一个JTextArea来显示搜索结果。我有一个api用于搜索和修改名称,唯一的问题是将小部件连接到方法和动作侦听器文件。

以下是代码的一些部分:

小工具文件:

//Text Field
JTextField searchbox = new JTextField();
leftSide.add(searchbox, cnt);

String userText = searchbox.getText();
ActionListener sendsText = new SearchListener(search box);
searchbox.addActionListener(sendsText);


//TextArea              
JTextArea stationList = new JTextArea(12, 0);
leftSide.add(stationList, cnt);

String entered = userText;
stationList.append(entered);

SearchListener:

    public class SearchListener implements ActionListener {
      private JTextField searchbox;
      private JTextArea stationList;


    public SearchListener(JTextField search box) {
        this.searchbox = searchbox;
    }
    public void ListF(JTextArea stationList){
        this.stationList = stationList;

    public void actionPerformed(ActionEvent event) {
       XXXX<NAMES> stations = HHHH.SimilarNames(searchbox.getText());

        for (NAMES station : stations) {
            //System.out.println(station);

*Problem*>    String result = (searchbox.getText());
*Problem*>    stationList.append(result);

    }

所以在这个程序中,TextFiels已连接且ActionListener正常工作,但它打印出CMD中类似名称的列表,(我在此处对此进行了评论)。但我希望它将列表发送回API中的文本区域。(窗口小部件文件)。所以我不确定SearchListener顶部的ActionListener方法是否正确。还有问题&gt;在代码中我厌倦了将搜索结果传递给文本字段,这不起作用。

所以任何人都知道如何解决它?

感谢提前。

2 个答案:

答案 0 :(得分:1)

我认为你可能会扭曲一些事情,但也许这就是你想要实现的目标:

一个搜索字段,其值决定了文本区域的填充内容。

如果是这种情况,那么必须改变一些事情。首先,只有在UI事件中才会对ActionListener中的代码进行处理,因此在初始化期间没有理由在任何UI元素上调用getText()

其次,在此UI中添加按钮可以极大地简化逻辑。如果将侦听器附加到搜索框,则会出现问题,例如“我何时知道用户输入了文本?”和“如何处理部分文本?”,但是使用“搜索”按钮将此逻辑放在用户手中。

单击“搜索”按钮后,将触发附加到按钮的侦听器的操作事件,stationListArea将填充similarNames(<text from search box>)的结果。

请注意,尽管下面显示的并不是执行此任务的最简洁方法(包括字段和匿名内部类),但它很简单易懂。

小部件(不确定cnt是什么,所以我在下面的示例代码中省略了)

//Create the search text box
JTextField searchBox = new JTextField();
leftSide.add(searchBox);

// Create a button that will serve as the "Action" for the search box
JButton searchButton = new JButton("Search");
lefSide.add(searchButton);

// Create the station-list text area that will display text
//  based on results from the search box
JTextArea stationListArea = new JTextArea(12, 0);
leftSide.add(stationListArea);

// Create a listener that listens to the Button, then performs an
//   action from the search box to the text area
ActionListener searchButtonListener = new SearchListener(searchBox, stationListArea);
searchButton.addActionListener(searchButtonListener);

SearchListener

注意:每次单击按钮并且stationListArea返回值时,此处的逻辑将继续在HHHH.SimilarNames()中添加文本。要让stationListArea每次更新新文本,替换旧版本,请在stationListArea.setText("")开头添加actionPerformed()

public class SearchListener implements ActionListener {
    private JTextField searchBox;
    private JTextArea stationListArea;

    public SearchListener(JTextField searchBox, JTextArea stationListArea) {
        this.searchBox = searchBox;
        this.stationListArea = stationListArea;
    }

    public void actionPerformed(ActionEvent event) {
        XXXX<NAMES> stations = HHHH.SimilarNames(searchBox.getText());

        for (NAMES station : stations) {
            stationListArea.append(station);
        }
    }
}

答案 1 :(得分:0)

根据主要评论中的反馈更新

您的NAMES对象需要某种方式来提供自己的String表示。这样,您就可以将该值附加到文本区域..

public class SearchListener implements ActionListener {
    private JTextField searchbox;
    private JTextArea stationList;

    public SearchListener(JTextField search box) {
        this.searchbox = searchbox;
    }

    public void actionPerformed(ActionEvent event) {
        XXXX<NAMES> stations = HHHH.SimilarNames(searchbox.getText());

        for (NAMES station : stations) {
            stationList.append(station.getLocationName()());
        }

}