如何在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 位于应用程序的最顶层,覆盖了整个区域。这意味着您可以在任何地方绘制任何东西。
各位程序员大家好!
老实说,我不确定标题问题是否正确,你会明白为什么的。 在我解释我做什么以及为什么之前,这里是代码片段:
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 位于应用程序的最顶层,覆盖了整个区域。这意味着您可以在任何地方绘制任何东西。