1

我是 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 方法在 CollisionPanel 文件中创建,如下所示:

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

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

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

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

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

4

3 回答 3

1

好的,我认为我最终遇到了问题,这是因为 IDE,您在 main 方法中看到您启动了一个新的CollisionPanel,这是错误的,netbeans 已经在 中添加并启动了该面板SimulatorGUI,所以现在您需要什么要做的是在 中添加一个 get 方法SimulatorGUI来获取启动的面板,然后在该面板上调用更新方法。

因此,将其添加到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类而不是仅在构造函数中调用它。

我希望这很容易掌握,如果您不确定,请告诉我

于 2012-07-02T16:51:40.640 回答
1

您在哪里将您的 CollisionPanel 添加到主 GUI?我担心这是您的问题,您需要这样做才能使您的代码正常工作。事实上,你的三个类中的任何一个在哪里得到对其他类的引用?为了使不同的类在一个程序中工作,它们之间必须有一些通信。了解如果您在 GUI 内创建一个 CollisionPanel 对象,并在主方法内创建另一个 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
}
于 2012-07-02T16:51:41.073 回答
0

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

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

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

所以这:

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

将生成一个表示属性已被修改的事件。所以控制器将更新视图。

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

希望这可以帮助..

于 2012-07-02T16:53:03.133 回答