如何在初始化中访问/更改变量?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()方法没有帮助。再次感谢您的评论和建议!好的,现在一切都很好,我不知道为什么。重新绘制()不起作用,现在一切都很完美:)再次感谢!谢谢,修复了我的部分代码,现在一切正常:)