为游戏移动 JLabel
Moving a JLabel for a game
我正在编写一个可以自己玩的西洋双陆棋游戏。虽然后端代码大部分已完成,但我和我的同事在 GUI 编码方面几乎没有经验。我们使用了Eclipse插件给的Designer,大部分代码都生成了。
事情是这样的。现在有一个 JFram
e,其中有一个 JPanel
,其中有 2 个 JLabels
,一个用于背景,一个用于 1 个棋子(当我弄明白时,其余的将添加)。这些都在 initialize()
方法中,即 运行 到 EventQueue.invokeLater(new Runnable())
。棋盘和棋子画完后,调用了startGame()
方法,最后就到了一个叫movePiece()
的方法,目的就是移动我之前讲过的那个JLabel
棋子。
我已经尝试了几乎所有我能想到的方法,我搜索了论坛,只发现人们在谈论布局(正如我所说,我可能会或可能不会使用生成的代码)和该死的 JLabel
当我在 movePiece()
方法中调用 setLocation()
时不会移动。它总是在那条线上抛出一个 NullPointerException
,这很奇怪,因为图像已经绘制好了。我将在下面包含部分代码。
我知道这可能看起来像一些最糟糕的代码,但请忍受我的技能不足并帮助我改进它。有什么见解吗?
public class Main{
public JLabel image1;
private JFrame frame;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Main window = new Main();
window.frame.setVisible(true);
new Main(1);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Main() {
initialize();
}
public Main(int i){
startGame();
}
public void startGame() {
//game code
movePiece(Move.getPos(), Move.getDest());
//rest of code
}
public void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 1023, 617);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setPreferredSize(new Dimension(800, 700));
JPanel panel_1 = new JPanel();
panel_1.setPreferredSize(new Dimension(200, 700));
frame.getContentPane().add(panel_1, BorderLayout.EAST);
JButton btnNewButton = new JButton("Start Game");
/* ACTION LISTENER FOR THE BUTTON */
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
}
});
btnNewButton.setFocusable(false);
btnNewButton.setForeground(SystemColor.windowBorder);
btnNewButton.setBackground(SystemColor.menu);
btnNewButton.setVerifyInputWhenFocusTarget(false);
btnNewButton.setRequestFocusEnabled(false);
btnNewButton.setRolloverEnabled(false);
btnNewButton.setFont(new Font("Verdana", Font.PLAIN, 11));
btnNewButton.setDebugGraphicsOptions(DebugGraphics.NONE_OPTION);
/* ADDING THE BTN TO PANEL 1 TO THE RIGHT */
panel_1.add(btnNewButton);
JPanel parentPanel = new JPanel();
parentPanel.setFocusable(false);
parentPanel.setEnabled(false);
parentPanel.setDoubleBuffered(false);
parentPanel.setDebugGraphicsOptions(DebugGraphics.NONE_OPTION);
parentPanel.setIgnoreRepaint(true);
parentPanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
parentPanel.setBorder(null);
parentPanel.setPreferredSize(new Dimension(800, 700));
parentPanel.setBackground(SystemColor.menu);
frame.getContentPane().add(parentPanel, BorderLayout.WEST);
/* BACKGAMMON BOARD LABEL-->PANEL */
ImageIcon imageIcon = new ImageIcon(
new ImageIcon("images/bg.png").getImage()
.getScaledInstance(800, 551, Image.SCALE_SMOOTH));
parentPanel.setLayout(null);
ImageIcon imageIcon1 = new ImageIcon(
new ImageIcon("images/pl.png").getImage()
.getScaledInstance(50, 50, Image.SCALE_SMOOTH));
image1 = new JLabel("");
image1.setBounds(37, 36, 50, 50);
parentPanel.add(image1);
image1.setIcon(imageIcon1);
JLabel bg = new JLabel("");
bg.setBounds(10, 11, 800, 551);
bg.setIcon(imageIcon);
parentPanel.add(bg);
}
void movePiece(int pos, int dest) {
//null exception happens here, ignore the arguments
image1.setLocation(37 + 50,36);
}
您创建了 Main
的实例并使其可见...
Main window = new Main();
window.frame.setVisible(true);
然后您创建一个 Main
的新实例,它通过它的构造函数调用您的 moviePiece
方法...
new Main(1);
但是 Main
的新实例与之前的实例或它们创建的任何组件无关。
相反,尝试做...
window.movePiece(Move.getPos(), Move.getDest());
而不是new Main(1);
我正在编写一个可以自己玩的西洋双陆棋游戏。虽然后端代码大部分已完成,但我和我的同事在 GUI 编码方面几乎没有经验。我们使用了Eclipse插件给的Designer,大部分代码都生成了。
事情是这样的。现在有一个 JFram
e,其中有一个 JPanel
,其中有 2 个 JLabels
,一个用于背景,一个用于 1 个棋子(当我弄明白时,其余的将添加)。这些都在 initialize()
方法中,即 运行 到 EventQueue.invokeLater(new Runnable())
。棋盘和棋子画完后,调用了startGame()
方法,最后就到了一个叫movePiece()
的方法,目的就是移动我之前讲过的那个JLabel
棋子。
我已经尝试了几乎所有我能想到的方法,我搜索了论坛,只发现人们在谈论布局(正如我所说,我可能会或可能不会使用生成的代码)和该死的 JLabel
当我在 movePiece()
方法中调用 setLocation()
时不会移动。它总是在那条线上抛出一个 NullPointerException
,这很奇怪,因为图像已经绘制好了。我将在下面包含部分代码。
我知道这可能看起来像一些最糟糕的代码,但请忍受我的技能不足并帮助我改进它。有什么见解吗?
public class Main{
public JLabel image1;
private JFrame frame;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Main window = new Main();
window.frame.setVisible(true);
new Main(1);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Main() {
initialize();
}
public Main(int i){
startGame();
}
public void startGame() {
//game code
movePiece(Move.getPos(), Move.getDest());
//rest of code
}
public void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 1023, 617);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setPreferredSize(new Dimension(800, 700));
JPanel panel_1 = new JPanel();
panel_1.setPreferredSize(new Dimension(200, 700));
frame.getContentPane().add(panel_1, BorderLayout.EAST);
JButton btnNewButton = new JButton("Start Game");
/* ACTION LISTENER FOR THE BUTTON */
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
}
});
btnNewButton.setFocusable(false);
btnNewButton.setForeground(SystemColor.windowBorder);
btnNewButton.setBackground(SystemColor.menu);
btnNewButton.setVerifyInputWhenFocusTarget(false);
btnNewButton.setRequestFocusEnabled(false);
btnNewButton.setRolloverEnabled(false);
btnNewButton.setFont(new Font("Verdana", Font.PLAIN, 11));
btnNewButton.setDebugGraphicsOptions(DebugGraphics.NONE_OPTION);
/* ADDING THE BTN TO PANEL 1 TO THE RIGHT */
panel_1.add(btnNewButton);
JPanel parentPanel = new JPanel();
parentPanel.setFocusable(false);
parentPanel.setEnabled(false);
parentPanel.setDoubleBuffered(false);
parentPanel.setDebugGraphicsOptions(DebugGraphics.NONE_OPTION);
parentPanel.setIgnoreRepaint(true);
parentPanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
parentPanel.setBorder(null);
parentPanel.setPreferredSize(new Dimension(800, 700));
parentPanel.setBackground(SystemColor.menu);
frame.getContentPane().add(parentPanel, BorderLayout.WEST);
/* BACKGAMMON BOARD LABEL-->PANEL */
ImageIcon imageIcon = new ImageIcon(
new ImageIcon("images/bg.png").getImage()
.getScaledInstance(800, 551, Image.SCALE_SMOOTH));
parentPanel.setLayout(null);
ImageIcon imageIcon1 = new ImageIcon(
new ImageIcon("images/pl.png").getImage()
.getScaledInstance(50, 50, Image.SCALE_SMOOTH));
image1 = new JLabel("");
image1.setBounds(37, 36, 50, 50);
parentPanel.add(image1);
image1.setIcon(imageIcon1);
JLabel bg = new JLabel("");
bg.setBounds(10, 11, 800, 551);
bg.setIcon(imageIcon);
parentPanel.add(bg);
}
void movePiece(int pos, int dest) {
//null exception happens here, ignore the arguments
image1.setLocation(37 + 50,36);
}
您创建了 Main
的实例并使其可见...
Main window = new Main();
window.frame.setVisible(true);
然后您创建一个 Main
的新实例,它通过它的构造函数调用您的 moviePiece
方法...
new Main(1);
但是 Main
的新实例与之前的实例或它们创建的任何组件无关。
相反,尝试做...
window.movePiece(Move.getPos(), Move.getDest());
而不是new Main(1);