导入javax.swing。*;
class Labels扩展JFrame { JPanel pnl = new JPanel();
ImageIcon duke = new ImageIcon("duke.png");
JLabel lbl1 = new JLabel(duke);
JLabel lbl2 = new JLabel("Duke is the friendly mascot of Java technology.");
JLabel lbl3 = new JLabel ("Duke", duke, JLabel.CENTER);
public Labels(){
super("Swing Labels");
setSize(1000 , 800);
setDefaultCloseOperation( EXIT_ON_CLOSE);
add(pnl);
setVisible(true);
lbl1.setToolTipText("Duke - the Java Mascot");
lbl3.setHorizontalTextPosition(JLabel.CENTER);
lbl3.setVerticalTextPosition(JLabel.BOTTOM);
pnl.add(lbl1);
pnl.add(lbl2);
pnl.add(lbl3);
}
public static void main(String [] args){
Labels gui = new Labels();
}
}
如果我想将它用作JApplet怎么办?必须做什么?难以改变吗?
在JFrame上运行的东西与JApplet上运行的东西相同吗?
答案 0 :(得分:3)
正如我在one of your previous questions中所建议的那样,您应该重新组织您的程序以符合Model-View-Controller模式或其变体之一,因为这样可以让您干净地分离出控制代码(来自GUI的ActionListener调用。有关M-V-C计划的示例,请查看我在this recent answer中的建议和代码。
答案 1 :(得分:3)
好的,首先看看这个:action listener in another class - java
现在您所要做的就是根据需要进行编辑,然后在actionPerformed(ActionEvent ae)
中,您将通过使用accessor / get方法访问数据来获取controlB.java类中的值,或者使用Actionlistener类扩展ControlB以便它可以访问它的所有公共数据,然后一旦你有了这些值,在启动期间或使用mutator / set方法将它们传递给Graph.java?
答案 2 :(得分:3)
如果你只允许来自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是一个匿名的内部类吗?如果您只是将它与特定的图形和B实例一起使用,那么就这样了。如果是这样,它必须从其包含的类中获取对Graph实例的引用,这意味着B有这样的实例来提供它。
ActionListener的动作可以在其他地方重复使用吗? “输入数字”小部件是否会出现在其他JPanels的其他位置?如果是这样,那就让它独立一堂您仍然需要对图形的引用,因此要么将图形作为构造函数参数和/或具有setGraph方法,因为它需要知道图形实例以便它可以向它发送消息。
完成!
编辑2
好的,让我们将您拥有的内容映射到MVC框架。因此,您的视图包含Graph类以及B类和textFields。
现在包含在图表类中,您还拥有要绘制图表的数据。这是您定义的开始,结束,x,y变量。要成为MVC-land的好公民,你必须将它们拉出来并将它们包含在一个单独的对象中,它们构成了图形的模型。基本上,模型是您希望呈现的一组事实,而不管它们将如何呈现,而视图是所有与绘制内容相关的代码。
因此,此模型对象将是一个简单的数据对象,其中包含已定义的所有变量的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相关联。
将图表与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
现在一个复杂的问题可能是,在您拥有所有四个文本字段的信息之前,您无法更新图表。有不同的方法可以更改此代码以适应这种情况,但这是您需要去的基本概念。
HTH
答案 3 :(得分:1)
行。我们来谈谈你的RangeXY对象。它的目的是什么?我问,因为它似乎不需要来自JTextFields的任何内容,即来自用户输入。
你正在调用graph.doStuffWithIntegerInput(),实际上,你没有使用来自用户的整数输入,这是来自文本字段的。你正在使用(这是错误的)你传入RangeXY构造函数的int。然后你(这里是“正确的错误”部分)将int赋予Integer静态方法getInteger()。实际上,由于getInteger接受一个String并将其转换为整数,因此无法编译。
好的,让我们这样做吧。一次做一件事。首先,编写一个符合此描述的类:
它实现了ActionListener; 它有一个Graph的成员变量; Graph的成员变量可以在setter中设置,也可以传递给构造函数。 它有一个EMPTY actionPerformed方法(现在)
就这样做,我们会从那里拿走它。