繁体   English   中英

两个类之间的ActionListener

[英]ActionListener between two classes

import 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上的东西相同?

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

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

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

如果你只允许来自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

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

在你调用graph.doStuffWithIntegerInput()的地方,实际上,你没有使用来自用户的整数输入,这是来自文本字段的。 你正在使用(这是错误的)你传入RangeXY构造函数的int。 然后你(这里是“正确的错误”部分)将int赋予Integer静态方法getInteger()。 实际上,由于getInteger接受String并将其转换为Integer,因此无法编译。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM