有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法更新JLabel数组

我在写一个东西,它有一个JLabel数组,在第一个索引中有一些东西,然后检测将东西向右移动的正确键。基本上,[x][[]启动,然后如果我按正确的键,它将切换到[][x][[]。目前,我无法使JLabel正确更新。一开始它显示正确,但当我按正确的键时,整个事情就搞砸了。也就是说,它是这样开始的:

image

(我有数字来衡量换档情况,当我解决这个问题时,数字就会消失)

这是正确的,但当我按正确的键时,一切都消失了(只是空白)但是,我在控制台中的测试仍然提供了正确的值

这些数字甚至没有显示出来:/

以下是相关代码:

    public Template() {     
        for (int i = 0; i < 7; i++) {
            positions[i] = new JLabel();
            positions[i].setFont(new Font("Times New Roman", Font.PLAIN, 15));
            System.out.println("Yay");
        }

        // I initialize my JLabel array here instead of below because if I don't do this, there's no change whatsoever if I press the right key. I'm not sure if I did it correctly, though.
        initialize(p1, 0);
    }
    
    private void initialize(String p, int index) {      
        frame = new JFrame();
            
        JPanel header = new JPanel();
        header.setBackground(Color.WHITE);
            
        GridBagLayout gbl = new GridBagLayout();
        GridBagConstraints c = new GridBagConstraints();
        header.setLayout(gbl);
        header.setPreferredSize(new Dimension(400, 50));
        c.fill = GridBagConstraints.HORIZONTAL;
        
        for (int i = 0; i < 7; i++) {
            if (i == index) {
                positions[i].setText(p + "");
                System.out.println("indexed set");
            } else {
                positions[i].setText("" + i);
                System.out.println(positions[i].getText());
                System.out.println("set");
            }
            c.gridx = i;
            c.gridy = 0;
            header.add(positions[i], c);
        }
            
        frame.add(header, BorderLayout.NORTH);
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        playMove(p);
            
    }
    
    public void playMove(String p) {
        ...
            
        frame.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent keyEvent) {
                System.out.println("Game.keyPressed -- event: " + keyEvent);
                if (keyEvent.getKeyCode() == KeyEvent.VK_RIGHT) {
                    System.out.println("Right key pressed!");
                        
                    int index = searchHeader();
                    System.out.println("index: " + index);
                    if (index != 6) {
                        int shift = index + 1;
                        System.out.println("shift: " + shift);
                        SwingUtilities.updateComponentTreeUI(frame);
                        initialize(p, shift, t);
                    }
                }
            }
    
            @Override
            public void keyReleased(KeyEvent keyEvent) {
                System.out.println("Game.keyReleased -- event: " + keyEvent);
            }
        });
    }
        
    public int searchHeader() {
        for (int i = 0; i < 7; i++) {
            String val = positions[i].getText();
            if (val == "x" || val == "o") {
                System.out.println("i:" + i);
                return i;
            }
        }
        return 0;
    }

我的System.out.println();所有测试都返回正确的值(正确的索引、移位和数组中的数字),但我不确定为什么没有显示:/

如果我的代码需要澄清或遗漏了什么(我从上一篇文章中得到建议后确实删除了一些不相关的信息),请告诉我


共 (1) 个答案

  1. # 1 楼答案

    由于您没有提供一个我们可以复制到IDE、运行和调试的最小可运行示例,因此我提出了这个示例GUI,它显示了一个向右移动的X

    我使用向右箭头键执行换档

    这是启动应用程序时的GUI

    Shift Right Example 1

    这是将X移动三个位置后的GUI

    Shift Right Example 2

    这是移动X四个位置后的GUI

    Shift Right Example 3

    Oracle有一个有用的教程Creating a GUI With Swing。跳过Netbeans部分

    我做的第一件事是通过调用SwingUtilitiesinvokeLater方法来启动Swing应用程序。此方法确保在Event Dispatch Thread上创建和执行Swing组件

    接下来,我创建了一个JFrame。必须按特定顺序调用JFrame方法。这是我在Swing应用程序中使用的顺序

    我创建了一个主JPanel来保存八个JLabels的数组。我还创建了一个int来保持X的位置。我使用FlowLayout来布局JLabels的数组。I(使用Box类在JLabels之间放置一些空格

    在创建更复杂的游戏时,请使用普通的Java getter/setter类创建应用程序模型

    我使用键绑定将右箭头键绑定到Action类。我使用了AbstractAction,所以我只需要编写actionPerformed方法

    下面是完整的可运行代码

    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.KeyEvent;
    
    import javax.swing.AbstractAction;
    import javax.swing.BorderFactory;
    import javax.swing.Box;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.KeyStroke;
    import javax.swing.SwingUtilities;
    
    public class ShiftRightExample implements Runnable {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new ShiftRightExample());
        }
        
        private int position;
        
        private JLabel[] spotLabel;
        
        public ShiftRightExample() {
            this.position = 0;
        }
    
        @Override
        public void run() {
            JFrame frame = new JFrame("Shift Right Example");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            JPanel mainPanel = createMainPanel();
            frame.add(mainPanel, BorderLayout.CENTER);
            setKeyBindings(mainPanel);
            
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
        
        private JPanel createMainPanel() {
            JPanel panel = new JPanel(new FlowLayout());
            panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
            
            this.spotLabel = new JLabel[8];
            for (int index = 0; index < spotLabel.length; index++) {
                spotLabel[index] = new JLabel(" ");
                panel.add(spotLabel[index]);
                if (index < (spotLabel.length - 1)) {
                    panel.add(Box.createHorizontalStrut(20));
                }
            }
            
            updateMainPanel(position, "X");
            
            return panel;
        }
        
        private void setKeyBindings(JPanel panel) {
            panel.getInputMap().put(
                    KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "shiftRight");
            panel.getActionMap().put("shiftRight", new ShiftRightAction());
        }
        
        public void updateMainPanel(int position, String value) {
            spotLabel[position].setText(value);
        }
        
        public class ShiftRightAction extends AbstractAction {
    
            private static final long serialVersionUID = 1L;
    
            @Override
            public void actionPerformed(ActionEvent event) {
                updateMainPanel(position, " ");
                position++;
                position = position % spotLabel.length;
                updateMainPanel(position, "X");
            }
            
        }
    
    }