2015-11-22 33 views
1

各位程序员好!如何在初始化中访问/更改变量? 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); 
     }  
}; 

所以这从一个自定义类我做的,我的问题的摘要将是,你看有一个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 

我有一个很难居然写下我的问题...希望你明白我想完成的任务。

+0

1.覆盖'paintComponent()',而不是'paint()'2.在'paintComponent()'的开始处调用'super.paintComponent()'3.不要将x/y坐标设置为'paintComponent()'方法。 4.您可以通过调用'panel.repaint()'来强制重画面板。5.变量名称(不是最终的)应该以小写字母开头6.动画可以用[timer](https:/ /docs.oracle.com/javase/tutorial/uiswing/misc/timer.html),例如在每次运行中更改x/y的值。 –

+0

谢谢!老实说,我正在用矩形搞乱,在我的项目中,我制作了一个图像加载类,它曾经被调用,将选择的图像加载到一个新的JPanel中(正如您可以从代码片段中看到的那样),并且此JPanel在类中,我做了x/y坐标全局,所以我可以从课堂外访问它,所以有“imageLoaded”对象,我想改变图像的坐标与“imageLoaded。X = insert_coordinate_here“我之所以这样做的原因是我可以在主框架上使用KeyListener移动面板,并制作了另一个”loadedImage(2)“ – Coldus12

+0

,我制作了3个矩形,第一个矩形位于loadedImage的坐标处,大小相同,第二个与loadedImage2相同,第三个是两者之间的交点,直到出现交叉点,loadedImage2才“可见”,只有交集是可见的,现在一切正常,但每当我移动了它显示交叉点的loadedImage1,但是不正确,因为它始终(并且仅)显示图像的左上角,然后我发现,我必须在面板上移动图像,我是 – Coldus12

回答

2

你是主要问题:如果你想给这个类新的可变字段,不要使用匿名内部类。相反,创建一个单独的类,它可以是一个内部类,但它不能是匿名的,给它与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); 
    } 
} 
+0

谢谢,修复了我的代码的一些部分,现在一切工作正常:) – Coldus12

0

没有必要创建全局变量。 您可以使用Swing的JComponent中的setBounds(x, y, w, h)来移动和调整JPanel的大小。 但是,您必须记住,Component不能在其边界外绘制。这意味着传递到paint(Graphics g)Graphics对象将被剪切并转换为适合其父项的Component。

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

让我举例说明最后的解决方案。考虑frame成为您JFrameplayerPanelJPanel你覆盖了paint()方法:

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

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