java - 移动游戏的 JLabel

标签 java swing jpanel jlabel

我正在编写一个可以自行玩的双陆棋游戏。虽然后端代码大部分已经完成,但我和我的同事几乎没有 GUI 编码的经验。我们使用了 Eclipse 插件提供的 Designer,生成了大部分代码。

所以事情是这样的。现在有一个 JFrame,它有一个 JPanel,其中有 2 个 JLabels,一个用于背景,一个用于 1 个游戏 block (当我弄清楚了,其余的将添加)。这些都在通过 EventQueue.invokeLater(new Runnable()) 运行的 initialize() 方法中。绘制棋盘和棋子后,将调用 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);

关于java - 移动游戏的 JLabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33683166/

相关文章:

java - BoxLayout 未添加另一个 JPanel

java - 如何滚动我的 JPanel

java - 跨越 JTable 特定列的所有行(以呈现 JTextPane)

java - 父面板未正确重绘

java - JAVA 中的 JPanel 内部的 JPanel

java - 如何通过右键单击Swing中的面板来绘制形状?

java - 将另一个类中的静态变量调用为可运行的

java - 如何连接Python聊天机器人和Java聊天室

java - 在 set 方法中抛出的最佳异常

java - 如何将此代码从 iOS swift 转换为 Android Kotlin