Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在初始化中访问/更改变量?JAVA_Java_Image_Swing_Jpanel_Paint - Fatal编程技术网

如何在初始化中访问/更改变量?JAVA

如何在初始化中访问/更改变量?JAVA,java,image,swing,jpanel,paint,Java,Image,Swing,Jpanel,Paint,各位程序员好 老实说,我不确定标题问题是否正确,你会明白原因的。 在解释我的工作和原因之前,下面是代码片段: JPanel playerPanel = new JPanel() { public void paint(Graphics g) { X = 1; Y = 1; g.drawImage(player.getScaledInstance(player.getHeight()/2, pl

各位程序员好

老实说,我不确定标题问题是否正确,你会明白原因的。 在解释我的工作和原因之前,下面是代码片段:

    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);
        }     
};
这是我制作的自定义类的一个片段,我的问题是,你看,有一个X和Y变量,我可以改变它们的值,但这不会改变实际程序的影响,我的第一个问题是,我可以改变这个JPanel图像的X和Y吗,如果可以,我如何“刷新”实际的JPanel/图像,使其看起来像是移动的

一些注意事项:

-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

我真的很难把我的问题写下来。。。希望您理解我想要完成的任务。

您的主要问题是:如果您想给类提供新的可变字段,请不要使用匿名内部类。相反,创建一个单独的类,它可以是一个内部类,但不能是匿名的,为它提供getter和setter所需的字段。此外,Luxx建议的一切都是正确的——重写PaintComponent,调用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来绘制任意位置

让我举例说明最后一个解决办法。考虑<代码>框架>代码>为您的<代码> jFrase<代码>和<代码> PravePosis<代码> <代码> JPANDOCT/<代码> >您覆盖了<代码> PrimeTo()/>代码>方法:

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

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

1。覆盖
paintComponent()
,而不是
paint()
2。在
paintComponent()
3开头调用
super.paintComponent()。不要在
paintComponent()
方法内设置x/y坐标。4.通过调用
panel.repaint()
5,可以强制面板重新绘制。变量名(非最终名称)应以小写字母6开头。一个动画可以通过一个例子来完成,在这个例子中,你每次运行都要更改x/y的值。谢谢!老实说,我在搞矩形,在我的项目中,我创建了一个图像加载类,它曾经调用过,将选定的图像加载到一个新的JPanel中(从代码片段中可以看到),这个JPanel在类内部,我将x/y坐标设为全局坐标,这样我就可以从类外部访问它,所以有了“imageLoaded”对象,我想用“imageLoaded.X=insert_coordinate_here”更改图像的坐标我这样做的原因是我可以在主框架上用KeyListener移动面板,并制作另一个“LoadeImage(2)”,我制作了3个矩形第一个是LoadeImage的坐标,大小相同,第二个与LoadeImage 2相同,第三个是两者之间的交点。LoadeImage 2在出现交叉点之前不“可见”,只有交叉点可见。现在一切正常,但每当我移动loadedImage1时,它都会显示交叉点,但并不正确,因为它总是(而且只是)显示图像的左上角,然后我发现,我必须移动面板上的图像本身,这就是我正在努力实现的目标。。。我可以编辑我的帖子,如果需要的话可以添加整个脚本,我会感谢任何帮助,我有点迷路了。repaint()方法没有帮助。再次感谢您的评论和建议!好的,现在一切都很好,我不知道为什么。重新绘制()不起作用,现在一切都很完美:)再次感谢!谢谢,修复了我的部分代码,现在一切正常:)