仍在尝试掌握 Java 中的类和方法是如何工作的。为了进行实验,我尝试创建一个图形类,其中包含一个空绘图框方法。然后,我尝试在主方法中调用该方法来尝试绘制这些框。我收到“无法解析为变量”错误,我认为这意味着主类由于某种原因无法看到我的其他类?
Boxymain.java:
import java.awt.*;
import javax.swing.JFrame;
public class Boxymain extends Canvas {
public static void main(String[] args){
BoxyMethod c = new BoxyMethod();
c.drawBox(window, Color.RED, 200, 300);
JFrame win = new JFrame("Boxy Main");
win.setSize(800,600);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Boxymain canvas = new Boxymain();
win.add(canvas);
win.setVisible(true);
}
}
BoxyMethod.java:
import java.awt.*;
import javax.swing.JFrame;
public class BoxyMethod {
public void drawBox(Graphics window, Color c, int x, int y){
window.setColor(c);
window.fillRect(x, y, 100, 100);
window.setColor(Color.WHITE);
window.fillRect(x+10,y+10,80,80);
}
}
错误文本:“窗口无法解析为变量。”
最佳答案
错误消息准确地告诉您出了什么问题。您将一个窗口变量传递到 drawBox 方法中,但在此之前您没有在 main 方法中声明或初始化这样的变量,因此这在 Java 中无法完成。
BoxyMethod c = new BoxyMethod();
// *** window variable below is used but never declared prior to use
c.drawBox(window, Color.RED, 200, 300);
更重要的是,您没有正确进行 Swing 绘图。
相反,您应该创建一个扩展 JPanel 的类,为其提供一个 paintComponent(Graphics g)
方法重写,并在该方法中进行绘制。然后将该 JPanel 放入 JFrame 中并显示该 JFrame。请查看Performing Custom Painting Swing 图形教程,了解有关如何制作 Swing 图形的更多详细信息。
顺便说一句,不要遵循您链接到的教程,因为它已经过时了 30 年。
<小时/>例如:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.*;
public class BoxyTest {
private static void createAndShowGui() {
JFrame frame = new JFrame("Boxy Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new BoxyPanel(200, 300));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
@SuppressWarnings("serial")
class BoxyPanel extends JPanel {
private static final int PREF_W = 800;
private static final int PREF_H = 650;
private int myX;
private int myY;
public BoxyPanel(int myX, int myY) {
this.myX = myX;
this.myY = myY;
}
@Override // so my JPanel will be big enough to see
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
@Override
protected void paintComponent(Graphics g) {
// call super method so that the JPanel can do housekeeping painting
super.paintComponent(g);
g.fillRect(myX, myY, 100, 100);
g.setColor(Color.WHITE);
g.fillRect(myX + 10, myY + 10, 80, 80);
}
}
关于Java:从一个类调用另一个类的方法时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25494851/