我正在尝试使用相同的JTextField和多个类的动作侦听器。即使是GridBagConstraints,我也希望处于相同的位置。有这样做的最佳方式吗?我这样做的当前方式是在下面的代码中,但是当用户搜索某些内容时,
//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的随机值。如果这个信息不充分,我很抱歉,请在下面评论您还想了解的其他信息。最后,我正在尝试为我的应用程序创建一个简单的搜索引擎。
答案 0 :(得分:1)
有几种方法可以实现这一目标......
创建一个自定义字段,按照您希望的方式设置自己,包括注册ActionListener
这种方法(个人)的问题是,你实际上并没有在该领域添加任何功能,你只是自定义配置,这似乎有点......毫无价值
创建一种可以创建搜索字段的新实例的工厂,它甚至可以用于配置JTextField
的预先存在的实例。
JTextField searchField = SearchFieldFactory.newInstance();
// and/or
JTextFeld searchField = new JTextField();
SearchFieldFactory.configureSearchField(searchField);
有关详细信息,请参阅factory pattern
使用某种构建器来自定义字段的创建方式......
ActionListener searchListener = ...
JTextField field = new SearchFieldBuilder().
setColumns(10).
setActionListener(searchListener).
newInstance();
这将允许您决定如何最好地自定义搜索字段,并根据您的需要定义默认自定义...
JTextField field = new SearchFieldBuilder().newInstance();
如果你有90%的时间生成相同的字段,但希望能够灵活地不时更改它,那真的很棒......
有关详细信息,请参阅builder pattern
这些限制提出了另一个问题......
提供某种产生约束的工厂
JTextField searchField = SearchFieldFactory.newInstance();
gamesPane.add(searchField, SearchFieldUtilities.newSearchFieldConstraints());
或者只是将指定的文本字段添加到指定的容器
JTextField searchField = SearchFieldFactory.newInstance();
SearchFieldUtilities.addToContainer(searchField, gamesPane);
或者让工厂创建搜索字段并将其添加到指定的容器....
SearchFieldUtilities.addNewSearchFieldTo(gamesPane);
然后,您可以将搜索字段的创建与此方法结合使用...
或者你可以简单地在某处存储static
个约束实例。每次应用约束时,GridBagLayout
都会生成一个本地副本,这意味着您可以实际修改它们,而不会影响先前使用父约束的相同实例添加的任何组件
就个人而言,我一般不会对预先设定约束的想法深信不疑,但话说回来,我并没有面对你的问题;)
答案 1 :(得分:0)
首先,您需要创建自定义JTextField
public class MyCustomTextField extends JTextField{
//constructor
// etc
}
然后你必须创建自己的Action侦听器或直接将它实现到你的jtf类并指定函数作为参数。
Bud i woud建议您在使用时自行创建并覆盖方法;)
创建自己的JTextField,并通过创建它的实例将它用于多个类。
即使是GridBagConstraints,我也希望处于相同的位置。是 有一种最佳方式吗?
是芽,这取决于你的代码结构。你使用什么设计。我不确定你试图通过你发布的代码实现什么,所以我不能告诉你。如果你试图使用GUI的某些部分在许多类中具有相同的功能和相同的视觉效果,或者将它们嵌入到jpanel中并以高级方式使用它。