Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从不同的Java文件引用方法_Java - Fatal编程技术网

从不同的Java文件引用方法

从不同的Java文件引用方法,java,Java,我是Java编程新手,面临着一个(很可能是)简单的问题,我似乎无法理解和理解 我有三个不同的java文件,一个是在其中创建接口(SimulatorGui.java),另一个是在接口中创建的jTabbedPanel上创建面板(CollisionPanel.java-CollisionPanel类),第三个是在其中运行代码,创建所需的输出(Collision.java-Colision类) 在Collision.java main方法中,我执行以下操作: public static void m

我是Java编程新手,面临着一个(很可能是)简单的问题,我似乎无法理解和理解

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

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

  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();
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();
}
这就成功了!我已经搜索和尝试了不同的东西,但似乎不明白为什么这不起作用


提前谢谢你的帮助,希望我已经把问题弄清楚了

好吧,我想我最终遇到了问题,这是因为IDE,你可以在你的主要方法中看到你启动了一个新的
冲突面板
,这是错误的,netbeans已经在
模拟器UI
中添加并启动了该面板,因此,现在需要做的是在
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()
方法调用,因为现在您只需调用
cp.updatePanel(“此处的文本”)SimulatorGUI
类中,而不是仅在构造函数中调用它


我希望这很容易理解,如果您不确定,请告诉我您在哪里将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
}

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

  • 视图:图形组件
  • 模型:您运行的代码
  • 控制器:检查是否更新模型以刷新视图
因此,当您第一次启动程序时,视图将在代码中指定值;例如,假设您使用初始值创建了
JTextArea
,并在此处键入。视图将显示
JTextArea
,并在此处键入文本
当对模型进行更改时,视图不知道该更改,控制器的工作是检查模型的更新,然后刷新视图

因此:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    updatepanel();
}
将生成一个事件,表明属性已被修改。因此,控制器将更新视图

除此之外,更改不会显示在视图上


希望这会有帮助。

不如早点发布一条求助信息。+1我确实同意这可能是个问题,不过如果OP做出一个决定,这会有所帮助SSCCE@DavidK:同意,并同意您的EDT记录1+返回给您。很抱歉,正如我刚刚听说的SSCCE,我不确定这是否是应该的,但我已经在pastebin创建了这些链接,其中包含了上述文件的完整代码。它们是:Collision.java-CollisionPanel.java-SimulatorGUI.java-@LuisAfonsoTeixeira:您做得不对,我认为您做得不对——创建了两个CollisionPanel对象,一个放在GUI上,另一个在main方法中创建。不要那样做。仅创建其中一个对象。感谢您的回复!我现在明白我做错了什么!当我使用Netbeans(忘了提及)时,代码是自动生成的!正如我在另一条评论中所述,我不确定这是否是SSCCE的目的,但以下是这些文件代码的链接:Collision.java-pastebin.com/BYs162Rv CollisionPanel.java-pastebin.com/UcwPUVhP SimulatorGUI.java-pastebin.com/9iXuhFzMAn SSCCE是一个简短、自包含且正确的示例。你所做的很好,但它缺少了RandomStream等类,SSCCE应该是描述/说明问题的最短代码,可以从简单的副本和过去运行,即使在你的pastebin示例之后,正如我所说,我仍然缺少引用。我不是说你现在给我引用的文件,正如我说的,创建一个例子,一旦这个例子被纠正,你可以简单地将它转换到你的实际代码中,从而减少更多的混淆谢谢你带我走过这段路。我相信这可以被认为是一个SSCE,因为我删除了这个示例中所有不必要的代码:Collision.java-一个快速的问题,为什么不在您的CollisionPanel构造函数调用upadatePanel()中相信与否,它修复了它!就像我想的那样D当我运行Collision.java时,将显示gui,并根据updatepanel()中的需要设置值!非常感谢你的帮助!我明白我的意思,那确实是我想的一件事