Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于多个类和创建搜索引擎,使用相同的JTextField_Java_Search_Boolean_Actionlistener_Jtextfield - Fatal编程技术网

Java 对于多个类和创建搜索引擎,使用相同的JTextField

Java 对于多个类和创建搜索引擎,使用相同的JTextField,java,search,boolean,actionlistener,jtextfield,Java,Search,Boolean,Actionlistener,Jtextfield,我试图在多个类中使用相同的JTextField和动作侦听器。即使是我希望处于相同的位置。有没有一种最佳的方法?我目前的做法是在下面的代码中,但是当用户搜索某个内容时 //Home Class static JTextField textField = new JTextField(); textField = new JTextField(); GridBagConstraints gbc_textField = new GridBagConstraints(); gbc

我试图在多个类中使用相同的JTextField和动作侦听器。即使是我希望处于相同的位置。有没有一种最佳的方法?我目前的做法是在下面的代码中,但是当用户搜索某个内容时

//Home Class
static JTextField textField = new JTextField();
    textField = new JTextField();
    GridBagConstraints gbc_textField = new GridBagConstraints();
    gbc_textField.gridwidth = 7;
    gbc_textField.insets = new Insets(0, 0, 5, 5);
    gbc_textField.fill = 2;
    gbc_textField.gridx = 2;
    gbc_textField.gridy = 1;
    homePane.add(textField, gbc_textField);
    textField.setColumns(10);
    textField.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            SearchEngine.search();
        }
    });

//Method to return textfield for use in other classes
    public static JTextField textField() {
        return textField;
    }


//Game Class
static JTextField textField = Home.textField();
        GridBagConstraints gbc_textField = new GridBagConstraints();
        gbc_textField.gridwidth = 5;
        gbc_textField.insets = new Insets(0, 0, 5, 5);
        gbc_textField.fill = 2;
        gbc_textField.gridx = 3;
        gbc_textField.gridy = 1;
        gamesPane.add(textField, gbc_textField);
        textField.setColumns(10);
        textField.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                SearchEngine.search();
            }
        });

    //SearchEngine Class
    //In the SearchEngine class I have a series of if-statements to determine if the word searched is in the database.

setSearched(false);//resets the value of the boolean back to false. If a condition is met in the series of if statements, the value is set to true.
            if ((Home.textField().getText().equalsIgnoreCase("battlefield 4")){
                    || (Home.textField().getText().equalsIgnoreCase("bf4"))) {
                    setSearched(true);
                    setImageSource("bf4");
                    setURL("www.google.com");
                    setNumoURL(1);
                }
            }
        Run.runResult();//Runs the searched result

如果布尔值为true,则显示图像。如果未找到,则会显示一个JLabel,表示“未找到”…或者应该显示。当前,布尔值到处都是,返回随机值true和false。我很抱歉,如果这是不够的信息,请评论下面还有什么你想知道的。最后,我尝试为我的应用程序创建一个简单的搜索引擎。

首先,您需要创建自定义的JTextField

public class MyCustomTextField extends JTextField{

 //constructor 

// etc

}
然后,您必须创建自己的操作侦听器,或者直接将其实现到jtf类,并将函数指定为参数

Bud我建议您自己创建并在使用时重写方法;)

创建自己的JTextField,并通过创建它的实例将其用于许多类

即使是我希望处于相同的位置。是 有没有一个最佳的方法


是的,这取决于你的代码结构。也取决于你使用的设计。我不确定你想从你发布的代码中获得什么,所以我不能告诉你。如果你试图使用GUI的某些部分,这些部分在许多类或部分中具有相同的功能和相同的视觉效果,那么就将其嵌入jpanel并以高级方式使用。

有几种方法可以帮助你也许可以做到这一点

你可以。。。 创建一个自定义字段,该字段按照您希望的方式进行设置,包括注册
ActionListener

这种方法(就个人而言)的问题在于,您实际上并没有向该字段添加任何功能,您只是在自定义配置,这似乎有点……毫无价值

你可以。。。 创建一个可以创建搜索字段新实例的工厂,它甚至可以用来配置
JTextField
的一个预先存在的实例

JTextField searchField = SearchFieldFactory.newInstance();
// and/or
JTextFeld searchField = new JTextField();
SearchFieldFactory.configureSearchField(searchField);
有关更多详细信息,请参阅

你可以。。。 使用某种生成器自定义字段的创建方式

ActionListener searchListener = ...
JTextField field = new SearchFieldBuilder().
                       setColumns(10).
                       setActionListener(searchListener).
                       newInstance();
这将允许您决定如何最好地自定义搜索字段,并定义您认为合适的默认自定义

JTextField field = new SearchFieldBuilder().newInstance();
如果您90%的时间都生成相同的字段,但希望能够灵活地随时更改它,那么这真是太棒了

有关更多详细信息,请参阅

制约因素提出了另一个问题

你可以。。。 提供某种工厂,它生成了约束

JTextField searchField = SearchFieldFactory.newInstance();
gamesPane.add(searchField, SearchFieldUtilities.newSearchFieldConstraints());
或者只是将指定的文本字段添加到指定的容器中

JTextField searchField = SearchFieldFactory.newInstance();
SearchFieldUtilities.addToContainer(searchField, gamesPane);
或者让一个工厂创建搜索字段并将其添加到指定的容器

SearchFieldUtilities.addNewSearchFieldTo(gamesPane);
然后,您可以将搜索字段的创建与此方法结合起来

或者,您可以将约束的
静态
实例存储在某个地方
GridBagLayout
将在每次应用约束时生成一个本地副本,这意味着您可以实际修改它们,而不会影响以前使用父约束的相同实例添加的任何组件

JTextField searchField = SearchFieldFactory.newInstance();
gamesPane.add(searchField, SearchFieldUtilities.newSearchFieldConstraints());
就我个人而言,我通常不相信预先定义约束的想法,但话说回来,我不会面对你的问题;)