如何在access/change中初始化一个变量? JAVA

How to access/change a variable in the initialization? JAVA

各位程序员大家好!

老实说,我不确定标题问题是否正确,你会明白为什么的。 在我解释我做什么以及为什么之前,这里是代码片段:

    JPanel playerPanel = new JPanel() {    
        public void paint(Graphics g) {
            X = 1;
            Y = 1;
            g.drawImage(player.getScaledInstance(player.getHeight()/2, player.getWidth()/2, Image.SCALE_DEFAULT), X, Y, null);
        }     
};

所以这是我制作的自定义 class 的片段,我的问题是,你看到有一个 X 和 Y 变量,我可以更改它们的值,但这对影响没有任何影响关于实际程序,我的第一个问题是我能否更改此 JPanel 图像的 X 和 Y,如果可以,我如何 "refresh" 实际 JPanel/Image 使其看起来像移动了?

一些注意事项:

-the X, Y are global variables

-playerPanel is inside a procedure, and a global variable

-i can access X, Y since they are global variables from outside the class

我很难真正写下我的问题......希望你明白我想完成什么。

您是主要问题:如果您想为 class 提供新的可变字段,请不要使用匿名内部 class。相反,创建一个单独的class,它可以是一个内部class,但它不能是匿名的,给它提供getters和setters需要的字段。 Luxx 推荐的所有内容也是正确的——覆盖 paintCompoent,调用 super 方法,不要在方法中声明字段...

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JPanel;

public class PlayerDrawingPanel extends JPanel {
    private int playerX;
    private int playerY;
    private Player player;

    public PlayerDrawingPanel(int playerX, int playerY, Player player) {
        this.playerX = playerX;
        this.playerY = playerY;
        this.player = player;
    }

    public void setPlayerX(int playerX) {
        this.playerX = playerX;
        repaint();
    }

    public void setPlayerY(int playerY) {
        this.playerY = playerY;
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(player.getImage(), playerX, playerY, this);
    }
}

无需创建全局变量。 您可以使用 Swing 的 JComponent 中的 setBounds(x, y, w, h) 来移动和调整 JPanel 的大小。 但是,您必须记住,组件不能在其边界之外绘制。这意味着传递给 paint(Graphics g)Graphics 对象会被剪裁和翻译以适应来自其父级的组件。

因此,要解决您的问题,您可以使用 setBounds() 让您的 JPanel 接管您想要绘制的整个区域,或者您可以从根面板中使用 LayeredLayout 在任何地方绘制。

让我举例说明最后一个解决方案。将 frame 视为您的 JFrame,将 playerPanel 视为您覆盖 paint() 方法的 JPanel

frame.setGlassPane(playerPanel);
frame.getGlassPane().setVisible(true);

现在您的playerPanel 位于应用程序的最顶层,覆盖了整个区域。这意味着您可以在任何地方绘制任何东西。