两个类之间的ActionListener(ActionListener between two cl

2019-09-18 05:20发布

进口的javax.swing *。

类标签延伸的JFrame {的JPanel PNL =新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的的人?

Answer 1:

正如我在建议你以前的问题之一 ,你应该重新组织你的程序,以符合模型-视图-控制器模式,或它的变体之一,因为这将允许你干净地分离出控制代码(即所谓的所述的ActionListener)从GUI。 对于MVC程序的示例,请查看我的建议和代码在这最近的答案 。



Answer 2:

:好吧好吧首先检查了这一点, 在另一个类的动作监听- java的

现在,所有你需要做的就是编辑它以您的需求,并在actionPerformed(ActionEvent ae)然后你会通过使用访问存取数据得到controlB.java类中的值/ get方法,或使的ActionListener类扩展ControlB所以它可以访问所有的公开数据,那么一旦你的价值,无论是启动或使用赋值函数/ set方法在它们传递到Graph.java?



Answer 3:

有些类,最好是一个内部类B的,如果你要只允许从JPanel的B输入端,必须实现ActionListener。 这ActionListener的已被添加到JTextField的:

myInputTextField.addActionListener(theActionListenerIAmGoingToWrite). 

这ActionListener的有定义的actionPerformed()是这样的:

String text = inputTextField.getText();
Integer inputInteger = Integer.getInteger(text).toInt(); 
graph.doStuffWithIntegerInput(inputInteger);

该设计的问题要回答是:

是ActionListener的匿名内部类? 如果你只打算与彼此了解图形和B的特定情况下使用它,那么走这条路。 如果是这样,它必须得到其含有类,这意味着B有这样一个实例,提供它的图形实例的引用。

是别处的ActionListener可重用的作用? 将在“输入号码”窗口小部件在其他地方出现在其他JPanels? 如果是这样使它成为一个独立的类。 你仍然需要参考图,从而以图表作为一个constrcutor参数和/或具有setGraph方法,因为在某种程度上,它需要了解的图实例,因此可以将其发送的消息。

完成了!

编辑2

OK让我们映射你有一个MVC框架是什么。 所以,你的观点是由图形类和类B和你的文本框的。

现在包含在您的图表类中,你也有你想图表中的数据。 这是开始,结束,X,Y你定义的变量。 要的MVC土地一个好公民,你就必须拉出来,这些和一个单独的对象中包含它们的B / C它们构成的图形的模型 。 模型是非常基本上,你希望事实集合到现在,不管他们如何去呈现的,而认为是所有关心画的东西到屏幕上的代码。

所以这个模型对象将与getter和setter你定义和将被传递到无论是在构造函数或通过图形对象上的二传手图形对象的所有变量的简单数据对象。

通过创建这个GraphData对象,你已经分离的观点,从中图的模型GraphData对象。

有了一个更复杂的图形,你实际上指定的是GraphModel你要创建什么图的“种”对象,有什么轴的名称会是这样,你想画,这样的东西是什么样的路线,但是这是矫枉过正你有什么。

OK,现在你有你的图表和GraphData对象和办法让他们在一起。

接下来让我们看一下你的类B.由于它是一个JPanel,视图,它本质上是其所含的意见的汇集和主持人。 这些将是图形和JTextField的。 所以,你加他们为你有,指定布局。

因此,一个假设的重构是这样的:

创建主程序。 在该主创建:JTextField的,的ActionListener,JPanel的(B),图和而GraphModel。

准而GraphModel与图表。

关联图与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



Answer 4:

好。 让我们来谈谈你的RangeXY对象。 其目的是什么? 我问,因为它似乎并不需要从JTextField中,也就是从用户输入任何内容。

当你打电话graph.doStuffWithIntegerInput(),其实,你不使用来自用户,也就是从文本字段随之而来的整数输入。 您正在使用(这是错误的),你传入RangeXY的构造一个int。 然后,你(这里来了“绝对错误”的部分)给予该int值以整数静态方法getInteger()。 其实,这不会编译因为getInteger需要一个字符串,并将其转换为整数。

OK让我们只是做到这一点。 做一两件事的时间。 首先,写出符合这个规则的一个类:

它实现的ActionListener; 它具有用于格拉夫一个成员变量; 对于图中的成员变量被设置在任一个设定器或传递给构造函数。 它有一个空的actionPerformed方法(现在)

只要做到这一点,我们就会把它从那里。



文章来源: ActionListener between two classes