【问题标题】:How to access/change a variable in the initialization? JAVA如何在初始化中访问/更改变量? JAVA
【发布时间】:2015-11-22 12:22:53
【问题描述】:

各位程序员大家好!

所以说实话,我不确定标题问题是否正确,你会明白为什么。 在我解释我做什么以及为什么之前,这里是代码 sn-p:

    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);
        }     
};

所以这是我制作的自定义类的 sn-p,我的问题是,你看到有一个 X 和 Y 变量,我可以更改它们的值,但这对实际程序的影响没有任何改变,我的第一个问题是我可以更改此 JPanel 图像的 X 和 Y,如果可以,我如何“刷新”实际的 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

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

【问题讨论】:

  • 1.覆盖paintComponent(),而不是paint() 2. 在paintComponent() 的开头调用super.paintComponent() 3. 不要在paintComponent() 方法内设置x/y 坐标。 4. 您可以通过调用panel.repaint() 强制面板重新绘制 5. 变量名称(不是最终的)应该以小写字母开头 6. 可以使用timer 来完成动画,例如,您可以在其中更改值每次运行 x/y。
  • 谢谢!老实说,我在搞乱矩形,在我的项目中,我创建了一个图像加载类,它一旦被调用,就会将选择的图像加载到一个新的 JPanel 中(从 sn-p 可以看到),这个 JPanel 在里面类,我将 x/y 坐标设置为全局的,所以我可以从类外部访问它,所以有“imageLoaded”对象,我想用“imageLoaded.X = insert_coordinate_here”更改图像的坐标,这就是为什么我这样做是因为我可以在主框架上使用 KeyListener 移动面板,并制作另一个“loadedImage(2)”
  • 我制作了 3 个矩形,第一个矩形位于 loadedImage 的坐标处,大小相同,第二个矩形与 loadedImage2 相同,第三个矩形是两者的交点。 loadImage2 直到有一个交叉点才“可见”,只有交叉点可见。现在一切正常,但是每当我移动loadedImage1时,它都会显示交叉点,但不正确,因为它总是(并且仅)显示图像的左上角,然后我发现,我必须移动面板本身的图像,这就是我的意思
  • 正在尝试完成...... repaint() 方法没有帮助。再次感谢您的评论和建议!
  • 好的,现在一切正常,我不知道为什么 .repaint() 不起作用,现在一切都完美了 :) 再次感谢!

标签: java image swing jpanel paint


【解决方案1】:

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

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);
    }
}

【讨论】:

  • 谢谢,修复了我的部分代码,现在一切正常 :)
【解决方案2】:

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

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

让我举例说明最后一个解决方案。将frame 视为您的JFrameplayerPanel,您覆盖了JPanel 方法:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-14
    • 2014-04-15
    • 1970-01-01
    • 2015-09-30
    • 2013-06-27
    • 2019-08-02
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多