从不同的Java文件引用方法

时间:2012-07-02 16:32:55

标签: java

我是Java编程的新手,面对一个(很可能)容易出错的问题,我似乎无法理解这个问题。

我有三个不同的java文件,一个是我创建一个接口(SimulatorGui.java),另一个是我创建一个面板,用于在界面中创建的jTabbedPanel(CollisionPanel.java - CollisionPanel类)和第三个,我运行一个代码来创建所需的输出(Collision.java - Colision类)。

在Collision.java主方法中,我正在执行以下操作:

  public static void main (String[] args) {

    //<editor-fold defaultstate="collapsed" desc="Simulation start procedures">
    Tally statC = new Tally ("Statistics on collisions");
    Collision col = new Collision (100, 50);
    col.simulateRuns (100, new MRG32k3a(), statC);
    //</editor-fold>


    new SimulatorGUI().setVisible(true);
    CollisionPanel update = new CollisionPanel();
    update.updatepanel();

第一个块,将创建所需的输出。然后我想将该输出发送到updatepanel!我没有向方法传递任何参数,因为我仍在尝试调试此方法。 updatepanel方法在CollisionPanel文件中创建如下:

public void updatepanel(){
    System.out.println ("debug");
    jTextArea1.setText("update\n");
}

当我运行Collision.java文件时,它将输出“debug”文本,但不会将文本设置为jTextArea1(append也不起作用)。然后我创建了一个按钮来尝试这样做,在这种情况下它可以工作。在CollisionPanel.java中:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    updatepanel();
}

这就是诀窍!我搜索并尝试了不同的东西,但似乎无法理解为什么这不起作用。

提前感谢您的帮助,希望我能解决问题!

3 个答案:

答案 0 :(得分:1)

好吧,我想我最终遇到了问题,而且是因为IDE,你在主要方法中看到你发起了一个新的CollisionPanel,这是错误的,netbeans已经添加并启动了该面板在SimulatorGUI中,现在您需要做的是在SimulatorGUI中添加get方法以获取启动的面板,然后在该面板上调用update方法。

因此请将其添加到SimulatorGUI

public CollisionPanel getCollisionPanel1() {
    return collisionPanel1;
}

将旧的updatePanel()方法替换为:

 void updatepanel(String str) {
            System.out.println ("debug");
            jTextArea1.setText(str);
         //   jTextArea1.revalidate();
            jLabel1.setText("test");
        }

在改变之后你的主要看起来像这样:

            SimulatorGUI simulatorGUI = new SimulatorGUI();
            simulatorGUI.setVisible(true);
            CollisionPanel cp=simulatorGUI.getCollisionPanel1();
            cp.updatepanel("Hi");

并且不要忘记从updatePanel()构造函数中删除旧的CollisionPanel方法调用,因为现在您只需在cp.updatePanel("text here");类中调用SimulatorGUI而不是仅调用它在构造函数中。

我希望这很容易掌握,如果你不确定让我知道

答案 1 :(得分:1)

您在哪里将CollisionPanel添加到主GUI?我担心这是你的问题,你需要为你的代码工作。事实上,你的三个班级中的任何一个都可以参考其他班级?对于在程序中工作的不同类,必须在它们之间进行一些通信。理解如果在GUI中创建CollisionPanel对象,并在main方法内部创建另一个CollisionPanel对象,则在一个对象上调用方法将对另一个对象产生无影响,因为它们是两个完全不同的实体

例如,此代码:

new SimulatorGUI().setVisible(true);
CollisionPanel update = new CollisionPanel();
update.updatepanel();

看起来你实际上是在CollisionPanel上调用updatePanel(),但它不在你GUI中可视化的任何CollisionPanel上。

考虑给SimulatorGUI一个方法,允许人们将CollisionPanel传递给它,以便它可以使用它。实际上这可能是一个构造函数参数:

CollisionPanel update = new CollisionPanel();
SimulatorGUI simulatorGUI = new SimulatorGUI(update);
update.updatePanel();

含义SimulatorGUI的构造函数必须类似于:

public SimulatorGUI(CollisionPanel update) {
   this.update = update;
   // add update to GUI somewhere
}

答案 2 :(得分:0)

开发GUI时有三个不同的级别:

  • 视图:图形组件
  • 模型:您运行的代码
  • 控制器:检查模型是否更新以刷新视图。

因此,当您第一次启动程序时,视图将在代码中分配值;例如,假设您使用初始值在此处输入创建了JTextArea。该视图将显示JTextArea,文字在此处输入
当对模型进行更改时,视图不是感知,控制器的工作是检查模型上的更新,然后刷新视图。

所以这个:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    updatepanel();
}

将生成一个说明属性已被修改的事件。因此控制器将更新视图。

除此之外,更改不会出现在视图中。

希望这会有所帮助..