我是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();
}
这就是诀窍!我搜索并尝试了不同的东西,但似乎无法理解为什么这不起作用。
提前感谢您的帮助,希望我能解决问题!
答案 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();
}
将生成一个说明属性已被修改的事件。因此控制器将更新视图。
除此之外,更改不会出现在视图中。
希望这会有所帮助..