4

导入 javax.swing.*;

类标签扩展 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 上运行的东西是一样的吗?

4

4 回答 4

3

正如我在您之前的一个问题中建议的那样,您应该重新组织您的程序以符合模型-视图-控制器模式或其变体之一,因为这将允许您干净地分离出控制代码(由来自 GUI 的 ActionListener)。有关 MVC 程序的示例,请查看我在这个最近的答案中的建议和代码。

于 2012-06-17T13:48:54.263 回答
3

好吧,首先检查一下:另一个类中的动作侦听器 - java

现在您所要做的就是根据您的需要对其进行编辑,actionPerformed(ActionEvent ae)然后您将通过使用访问器/获取方法访问数据来获取 controlB.java 类中的值,或者使 Actionlistener 类扩展 ControlB 以便它可以访问到它的所有公共数据,然后一旦你有了这些值,在启动期间或使用 mutator/set 方法将它们传递给 Graph.java?

于 2012-06-17T13:58:40.317 回答
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 是匿名内部类吗?如果您只想将它​​与相互了解的 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

现在一个复杂的问题可能是,在您获得所有四个文本字段的信息之前,您无法更新图表。有不同的方法可以更改此代码以适应它,但这是您需要去哪里的基本想法。

高温高压

于 2012-06-17T14:09:32.813 回答
1

好的。让我们谈谈您的 RangeXY 对象。它的目的是什么?我问是因为它似乎不需要来自 JTextFields 的任何东西,即来自用户输入。

实际上,在您调用 graph.doStuffWithIntegerInput() 的地方,您没有使用来自用户的整数输入,这是来自文本字段的输入。您正在使用(这是错误的)传入 RangeXY 的构造函数的 int。然后你(这里是“完全错误”的部分)将该 int 提供给 Integer 静态方法 getInteger()。实际上,这不会编译,因为 getInteger 接受一个字符串并将其转换为一个整数。

好的,让我们这样做。一次做一件事。首先,编写一个符合此描述的类:

它实现了 ActionListener;它有一个Graph的成员变量;Graph 的成员变量在 setter 中设置或传递给构造函数。它有一个 EMPTY actionPerformed 方法(现在)

只要这样做,我们就会从那里拿走它。

于 2012-06-17T23:20:59.033 回答