在main方法中,我试图运行它:
public static void main(String[] args)
{
game.paintBlocks(g);
}
为“g”参数获取“无法解析为变量”错误。
在其他地方我有这个,它调用另一个类中的另一个方法(paint(g))来绘制一个块网格:
public void paintBlocks(Graphics g)
{
for (int r = 0; r<7; r++)
{
for (int c = 0; c<5; c++)
{
block[r][c].paint(g);
}
}
我是否需要告诉它“g”在另一个班级?我是新手,任何帮助都会很棒!
答案 0 :(得分:1)
在paintBlocks
的情况下,g
是传递给方法的参数。在main
的情况下,g
引用了一个尚未在任何地方创建的变量。
Graphics
和Graphics2D
是抽象类,除了Swing之外,通常不打算实例化。 Graphics
和Graphics2D
给出的是绘制组件的上下文(如JPanel或BufferedImage)。
根据您的描述,您可能希望在某种类型的Swing组件上绘制块。 (虽然有点不清楚,但这是正常的事情。)例如,如果你在JPanel
上绘制块,通常要做的就是创建一个扩展的类JPanel
并覆盖paintComponent()
方法。你可能会这样做的一种方式:
public class BlocksPanel extends JPanel {
// Normal class fields, etc.
// ...
// I would consider making this private, but this is your method from above:
public void paintBlocks(Graphics g) {
for (int r = 0; r<7; r++) {
for (int c = 0; c<5; c++) {
block[r][c].paint(g);
}
}
}
@Override
public void paintComponent(Graphics g) {
paintBlocks(Graphics g);
}
}
this document.的第9页还有另一个可能对您有所帮助的示例Java Tutorials for the Java 2D API也可以提供帮助。
答案 1 :(得分:1)
你想在哪里画画?我假设您可能想要在屏幕上绘制一个窗口,在这种情况下,您不会自己调用paint *,您将让Swing框架在适当的时候调用它。在这种情况下,如果game
是JFrame
,那么您只需要让它可见;或者如果game
是其他类型的组件,那么您需要将其添加到可见窗口。这是我在用Java教授基本图形时通常使用的模式:
public class MyGame extends JPanel {
public static void main() {
JFrame window = new JFrame("My Game");
window.add(new MyGame());
window.pack();
window.setLocationRelativeTo(null); // Centers the window on the screen
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible();
}
public Dimension getPreferredSize() {
return new Dimension(800, 600);
}
protected void paintComponent(Graphics g) {
// Do my drawing here
}
}
如果要绘制到屏幕外图像,那么您需要创建自己的图形上下文以传递到paint *方法:
BufferedImage hello = new BufferedImage(game.getWidth(), game.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics g = hello.getGraphics();
game.paintBlocks( g );
答案 2 :(得分:0)
变量g
在主上下文中未定义,因为您尚未声明/初始化它。如果您查看paintBlocks(Graphics g)
方法,g
将作为参数传递,但该变量(g
)的范围在方法的大括号({}
)内paintBlocks(Graphics g)
。
如果你有一个名为MyClass
的类扩展了一个组件,比如JPanel
,你可以这样做:
class MyClass extends JPanel
{
public static void main(String[] args)
{
Graphics g = getGraphics(); //would return the graphics object for the JPanel
game.paintBlocks(g);
}
}
还值得注意的是,在某些情况下,上述方法会被标记为错误的编程风格。还有另一种选择。您可以使用组件提供的paintComponent(Graphics g)
方法。
你的主要看起来像这样:
public static void main(String[] args)
{
repaint(); //this repaints the component, calling the paintComponent method
}
自己调用paintComponent(Graphics g)
的编程风格也很糟糕。您应该允许系统调用该方法,这就是您使用repaint()
方法的原因。重新绘制时,系统会自动调用paintComponent(Graphics g)
。
从paintComponent(Graphics g)
开始,您可以执行此操作:
public void paintComponent(Graphics g)
{
super.paintComponent(g); //repainting the panel,not necessary in some cases
game.paintBlocks(g); //passing the graphics object used by the component
}
希望有所帮助!