当前位置: 首页 > 知识库问答 >
问题:

两个类之间的操作侦听器

鞠通
2023-03-14

导入javax.swing.*;

class Labels extensions 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上的东西是一样的吗?

共有3个答案

劳和雅
2023-03-14

某些类,最好是B的内部类,如果您只允许来自J面板B的输入,则必须实现ActionListener。该ActionListener必须添加到JText字段中:

myInputTextField.addActionListener(theActionListenerIAmGoingToWrite). 

ActionListener必须像这样定义actionPerformed():

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

需要回答的设计问题是:

ActionListener 是匿名内部类吗?如果你只打算将它与相互了解的图和B的特定实例一起使用,那么就走这条路。如果是这样,它必须从其包含类中获取对 Graph 实例的引用,这意味着 B 有这样一个实例来提供它。

ActionListener的动作可以在其他地方重用吗?“输入数字”小部件会出现在其他JPanels的其他地方吗?如果是这样,就把它变成一个独立的类。您仍然需要一个对Graph的引用,因此要么将graph作为构造器参数输入,要么有一个setGraph方法,因为它需要知道graph实例,以便可以向它发送消息。

做!

编辑2

好的,那么让我们将您所拥有的映射到MVC框架。因此,视图由Graph类、类B和textFields组成。

现在包含在图形类中,您也有想要绘制图形的数据。这是您定义的开始、结束、x、y变量。要成为MVC领域的一名好公民,您必须将它们取出并包含在一个单独的对象b/c中,它们构成了图形的模型。模型基本上是你想要呈现的一组事实,而不管它们将如何呈现,而视图则是所有与在屏幕上绘制内容相关的代码。

因此,这个模型对象将是一个简单的数据对象,其中包含您定义的所有变量的getter和setter,并将在构造函数或通过Graph对象上的setter传递到Graph对象中。

通过创建这个GraphData对象,您已经将视图、图表从它的模型GraphData对象中分离出来。

对于一个更复杂的图形,你实际上可以在图形模型中指定你想创建什么样的图形对象,轴的名称是什么,你想画什么样的线,诸如此类的东西,但这对你来说太过分了。

好了,现在你有了你的Graph和GraphData对象,以及将它们组合在一起的方法。

接下来让我们看看你的类b。因为它是一个JPanel,一个视图,它本质上是一个聚合器和它所包含的视图的表示器。那就是图表和JTextFields。因此,您可以添加它们,指定布局。

所以一个假设的重构是这样的:

创建主程序。在该主要创建中:JTextFields,ActionListener,JPanel (B),Graph和GraphModel。

将图形模型与图形关联。

将图形与JPel相关联。

将ActionListener与JJtext字段相关联

将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

东郭鸿福
2023-03-14

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

现在您所要做的就是根据需要编辑它,然后在actionPerformed(ActionEventae)中,您将获得controlB中的值。通过使用accessor/get方法访问数据,或者使Actionlistener类扩展ControlB,使其可以访问所有公共数据,然后一旦获得值,将其传递给Graph。java是在初始化期间还是使用mutator/set方法?

麹繁
2023-03-14

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

 类似资料:
  • 下面的代码是项目的动作侦听器。基本上,我有 4 个单选按钮,当我单击一个时,我希望它更改屏幕上的变量。当我运行代码时,它只是将所有值相加。还有其他方法可以做到这一点吗?

  • 我正在处理JButton事件。我有一个JPanel类,我们叫Panel1,包含一个公共的JButton,我们叫它Button1。单击此按钮时: 但我有兴趣: 有什么建议吗?

  • 问题内容: 我有两个分别称为“左”和“右”。“左”按钮将矩形对象向左移动,“右”按钮将其向右移动。我在班上有一个充当单击任一按钮时的侦听器。但是,我希望单击每个动作时都会发生不同的动作。如何区分点击的? 问题答案: 将actionCommand设置到每个按钮。 //将动作命令设置到两个按钮上。 更新:

  • 我们有web服务(jaxws),它正在调用另一个web服务(aslo jaxws)。Jaxws客户端配置如下所示-- 正如您所看到的,我们有两个拦截器和一个故障侦听器。我们希望在这些拦截器、故障侦听器和web服务代码之间进行通信。正如SO线程中所述,我们使用cxf交换对象在web服务和拦截器之间进行通信。 我们的inFaultInterceptor代码如下所示-- } Web服务代码如下所示- 但

  • 问题内容: 可能有两堂课,而在一堂课中 在另一个 //更多原因是因为我需要将按钮(摆动)分离到动作监听器 我该怎么办? 谢谢 问题答案: 不仅可以将这两个部分分开,而且还建议这样做(请参阅MVC模式-非常有关分离屏幕控件(如按钮)和程序逻辑) 我想到的最简单的方法是编写一个实现接口的命名类,如下所示: 然后将其添加到您的按钮:

  • @override public void actionPerformed(ActionEvent e){ }