某些类,如果您只允许来自 JPanel B 的输入,最好是 B 的内部类,必须实现 ActionListener。必须将 ActionListener 添加到 JTextField:
myInputTextField.addActionListener(theActionListenerIAmGoingToWrite).
那 ActionListener 必须定义 actionPerformed() 像这样:
String text = inputTextField.getText();
Integer inputInteger = Integer.getInteger(text).toInt();
graph.doStuffWithIntegerInput(inputInteger);
要回答的设计问题是:
ActionListener 是匿名内部类吗?如果您只想将它与相互了解的 graph 和 B 的特定实例一起使用,那么就这样吧。如果是这样,它必须从其包含的类中获取对 Graph 实例的引用,这意味着 B 有这样一个实例来提供它。
ActionListener 的动作是否可以在其他地方重用?“输入数字”小部件会出现在其他 JPanel 的其他地方吗?如果是这样,让它成为一个独立的类。您仍然需要对图形的引用,因此要么将图形作为 constrcutor 参数和/或具有 setGraph 方法,因为它需要以某种方式了解图形实例,以便它可以向其发送消息。
完毕!
编辑 2
好的,让我们将您拥有的内容映射到 MVC 框架。因此,您的视图由 Graph 类和您的 B 类以及您的 textFields 组成。
现在包含在您的图表类中,您还拥有要绘制图表的数据。这就是您定义的 start、finish、x 和 y 变量。要成为 MVC 领域的好公民,您必须将它们拉出并将它们包含在单独的对象 b/c 中,它们构成了您的图形模型。基本上,模型是您希望呈现的一组事实,无论它们将如何呈现,而视图则是与将内容绘制到屏幕上有关的所有代码。
因此,此模型对象将是一个简单的数据对象,其中包含您定义的所有变量的 getter 和 setter,并将在构造函数中或通过 Graph 对象上的 setter 传递给 Graph 对象。
通过创建这个 GraphData 对象,您已经将视图、Graph 从它的模型 GraphData 对象中分离出来。
对于更复杂的 Graph,您实际上会在 GraphModel 中指定要创建的 Graph 对象的“类型”、轴名称、要绘制的线类型,诸如此类,但这对于你有什么。
好的,现在您有了 Graph 和 GraphData 对象以及将它们组合在一起的某种方法。
接下来让我们看看你的 B 类。因为它是一个 JPanel,一个视图,它本质上是一个聚合器和它所包含的视图的呈现器。这些将是 Graph 和 JTextFields。因此,您可以按原样添加它们,指定布局。
所以一个假设的重构是这样的:
创建主程序。在那个主要创建:JTextFields、ActionListener、JPanel (B)、Graph 和 GraphModel。
将 GraphModel 与 Graph 关联。
将 Graph 与 JPanel 关联。
将 ActionListener 与 JJtextField 关联
将 JTextField 与 JPanel 关联
就编写 ActionListener 而言,只需使其成为自己的类,这是最容易编写和理解的。因此:
public class MyTextFieldListener implements ActionListener
{
private Graph graph;
public MyTextFieldListener(Graph graph)
{
this.graph = graph;
}// construtor
public void actionPerformed (ActionEvent ae)
{
String text = ((JTextField)ae.getSource()).getText();
Integer inputInteger = Integer.getInteger().(text).toInt();
graph.doStuffWithIntegerInput(inputInteger);
} // actionPerformed
}// class
现在一个复杂的问题可能是,在您获得所有四个文本字段的信息之前,您无法更新图表。有不同的方法可以更改此代码以适应它,但这是您需要去哪里的基本想法。
高温高压