Java:从一个类调用方法到另一个类时遇到问题

Java:从一个类调用方法到另一个类时遇到问题,java,swing,graphics,Java,Swing,Graphics,仍在努力掌握Java中类和方法的工作原理。为了进行实验,我尝试创建一个图形类,其中包含一个void draw box方法。然后,我尝试在main方法中调用该方法来尝试绘制这些框。我得到了“无法解析为变量”的错误,我相信这意味着主类由于某种原因无法看到我的其他类 Boxymain.java: import java.awt.*; import javax.swing.JFrame; public class Boxymain extends Canvas { public static

仍在努力掌握Java中类和方法的工作原理。为了进行实验,我尝试创建一个图形类,其中包含一个void draw box方法。然后,我尝试在main方法中调用该方法来尝试绘制这些框。我得到了“无法解析为变量”的错误,我相信这意味着主类由于某种原因无法看到我的其他类

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)
method覆盖,并在该方法中绘制。然后将该JPanel放在JFrame中并显示JFrame。请查看Swing graphics教程,了解有关如何使用Swing graphics的更多详细信息

顺便说一句,不要遵循你链接的教程,因为它已经过时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);
   }
}

错误消息会准确地告诉您出了什么问题。您正在将窗口变量传递到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)
method覆盖,并在该方法中绘制。然后将该JPanel放在JFrame中并显示JFrame。请查看Swing graphics教程,了解有关如何使用Swing graphics的更多详细信息

顺便说一句,不要遵循你链接的教程,因为它已经过时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);
   }
}

我应该注意到我是根据这个练习来尝试这个:我应该注意到我是根据这个练习来尝试这个:谢谢你的帮助。因为那些教程已经过时了(我不知道!),你还有什么其他建议可以让我研究吗?@komali_2:请看我在上面的回答中提供的链接。我在programmingbydo.com/a/examples/中仔细阅读了这些文件的日期,它们似乎是在2013年创建的。我如何判断这个长方体示例是否有30年的过时代码?30年!Java还处于青少年时期@他甚至更年轻。啊。。一定是神谕!谢谢你的帮助。因为那些教程已经过时了(我不知道!),你还有什么其他建议可以让我研究吗?@komali_2:请看我在上面的回答中提供的链接。我在programmingbydo.com/a/examples/中仔细阅读了这些文件的日期,它们似乎是在2013年创建的。我如何判断这个长方体示例是否有30年的过时代码?30年!Java还处于青少年时期@他甚至更年轻。啊。。一定是神谕!