Java 如何解决此错误?

Java 如何解决此错误?,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我目前正在为一个程序编写代码,当它工作时,会打开一个外部窗口,窗口上有一个建筑物和滚动横幅。如果在建筑物上方的文本框中输入短语,该短语将在横幅上滚动 显示窗口 import javax.swing.*; import java.awt.*; public class DisplayWindow extends JFrame { private Container c; public DisplayWindow() { super("Display");

我目前正在为一个程序编写代码,当它工作时,会打开一个外部窗口,窗口上有一个建筑物和滚动横幅。如果在建筑物上方的文本框中输入短语,该短语将在横幅上滚动

显示窗口

import javax.swing.*;
import java.awt.*;

public class DisplayWindow extends JFrame {
    private Container c;

    public DisplayWindow() {
       super("Display");
       c = this.getContentPane();
    }

    public void addPanel(JPanel p) {
       c.add(p);
    }

    public void showFrame() {
        this.pack();
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
移动信号面板

 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;

 public class MovingSignPanel extends JPanel implements ActionListener{
 JMenuBar b;
 JButton start = new JButton("Start");
 JButton stop = new JButton("Stop"); 
 JButton quit = new JButton("Quit");
 JTextField phrase = new JTextField(20);
 private int lVar = 200;
 private int rVar = 600;
 private int hVar = 200;
 private int ground = 400;
 private Timer scroll = new Timer(40,this);
 private int xVel = 2;
 private int xVal = lVar;
 private int yVal = 150;
 private String input = " ";
 private int inputWidth = 0;
 private Boolean scrolling = false;


 public MovingSignPanel(JMenuBar b){
     setPreferredSize(new Dimension(1000, 1000));
     setBackground(Color.white);
     this.add(phrase);
     phrase.addActionListener(this);
     this.add(start);
     start.addActionListener(this);
     this.add(stop);
     stop.addActionListener(this);
     this.add(quit);
     quit.addActionListener(this);
 }


 public void drawBanner(Graphics g){
     clearBanner(g);
     drawBuilding(g);
     int position = xVal;
     while(position < rVar){
        g.drawString(input,position,yVal);
        position += inputWidth;
     }
     position = xVal - inputWidth;
     while(position > lVar - inputWidth){
        g.drawString(input,position,yVal);
        position -= inputWidth;
     }
     if(xVal > rVar)
       xVal -= inputWidth;
     xVal += xVel;
     drawBuilding(g);
}

public void drawBuilding(Graphics g){
    super.paintComponent(g);
    g.setColor(Color.white);
    g.fillRect(0,0,1000,1000);
    g.setColor(Color.gray);
    g.fillRect(lVar,200,rVar-lVar,hVar);
    g.fillRect(lVar,100,rVar-lVar,hVar-800);
    g.setColor(Color.lightGray);
    g.fillRect(0, ground, 700, 400 - ground);
    g.setColor(Color.blue);
    for(int n = lVar + 20; n < rVar - 10; n += 40){
        for(int m = 60; m < 150; m += 30){
            g.fillRect(n,m,20,20);
        }
    }
    for(int n = lVar + 20; n < rVar - 10; n += 40){
        for(int m = 210; m < 350; m += 30){
            g.fillRect(n,m,20,20);
        }
    }
    g.setColor(Color.darkGray);
    g.fillRect(0,0,lVar,ground);
    g.fillRect(rVar,0,lVar,ground);
}

public void inputMsg(){
   input = phrase.getText();
    inputWidth = phrase.getText().length();
}

public void resetTimer(){
   scroll.stop();
   scrolling = false;
}

public void startMsg(){
    inputMsg();
    if(!scrolling){
        scroll.start();
        scrolling = true;
    }
}  

public void clearBanner(Graphics g){
   g.clearRect(0,0,1000,1000);
}

public void actionPerformed(ActionEvent e){
    if (e.getSource() == quit)
        System.exit(0);
    if (e.getSource() == start)
        repaint();
        startMsg();
    if (e.getSource() == stop)
        resetTimer();
}
}
如果需要的话,我可以组织得更好。我知道按钮还不起作用,但现在我更关心的是为什么在程序运行时什么也没画出来。每当我尝试运行该程序时,就会出现如下错误:

java.lang.NoSuchMethodError: MovingSignPanel.<init>(Ljavax/swing/JMenuBar;)V
at SignDriver.main(SignDriver.java:9)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)

似乎您的SignDriver类在运行时有一个旧版本的类MovingSignPanel,这个版本没有这个构造函数MovingSignPaneljavax.swing.JMenuBar。只要尝试清理和重建,这个错误就会消失

你所说的程序何时运行是什么意思?您是如何编译/部署的?编译程序后,它无法成功运行。如何编译?您是使用IDE还是使用javac手动编译类?我使用IDE编译它。如果需要,我可以更好地组织它。-不要问,从一开始就做。没有人希望看到缩进不正确的代码。这次我是为你做的。在这个作业中,我不能更改SignDriver类。我并不是在寻找一个直接的答案,但我该如何清理我的代码,使SignDriver与MovingSignPanel兼容呢。我只是想了解为什么会发生这种情况,以供将来参考。好吧,您需要重新编译MovingSignPanel,并在运行时将其部署到需要的地方。问题在于运行时MovingSignPanel.class的版本不是最新的。这是我根据您在这里发布的错误所想的。我猜测问题出现在MovingSignPanel类中,其中MovingSignPanel方法声明了一个JMenuBar对象。似乎SignDriver不知道该怎么做。不,问题在这里:SignDriver.java:9。这行代码调用MovingSignPanel的构造函数。问题是,这个构造函数即使在Java代码文本文件中,也不在MovingSignPanel的字节码类文件中。JRE不执行文本文件,而是执行类文件。如果该类文件与您的文本文件不匹配,那么您有责任重建文本文件并重新部署它,以便在运行时JRE可以看到新版本的类文件。我想我理解您的意思,谢谢。我会设法弄清楚的。
java.lang.NoSuchMethodError: MovingSignPanel.<init>(Ljavax/swing/JMenuBar;)V
at SignDriver.main(SignDriver.java:9)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)