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)