Ada
Ada

Reputation: 1

Can't update JLabel array

I'm writing a thing that has a JLabel array that has something in the first index and then detects right keys that shifts the thing to the right. Basically, [x][][][][][][] starts, then if I press the right key, it shifts to [][x][][][][][]. Currently, I can't get the JLabel to properly update. It shows up correctly at first, but when I hit the right key, the entire thing gets messed up. Ie, it starts like this:

image

(I have the numbers to gauge the shifting, they'll go away when I figure this problem out)

Which is right, but when I hit the right key, everything disappears (just blank.) However, my test in the console still gives me the correct values though.

The numbers don't even show up :/

Here's the relevant code:

    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;
    }

My System.out.println(); tests all return the correct values (the correct index, shift, and numbers in the array) but I'm not sure why the thing isn't showing up :/

If my code needs clarification or missed something (I did cut some irrelevant info off after taking advice from my last post) please tell me

Upvotes: 0

Views: 61

Answers (1)

Gilbert Le Blanc
Gilbert Le Blanc

Reputation: 51445

Since you didn't provide a minimal runnable example that we could copy into our IDE, run, and debug, I came up with this example GUI that shows an X shifting to the right.

I used the right arrow key to perform the shift.

Here's the GUI when starting the application.

Shift Right Example 1

Here's the GUI after shifting the X three positions.

Shift Right Example 2

Here's the GUI after shifting the X four positions.

Shift Right Example 3

Oracle has a helpful tutorial, Creating a GUI With Swing. Skip the Netbeans section.

The first thing I did was start the Swing application by calling the SwingUtilities invokeLater method. This method ensures that the Swing components are created and executed on the Event Dispatch Thread.

Next, I created a JFrame. The JFrame methods must be called in a specific order. This is the order I use for my Swing applications.

I created a main JPanel to hold the array of eight JLabels. I also created an int to hold the position of the X. I used a FlowLayout to lay out the array of JLabels. I( used the Box class to put some space between the JLabels.

As you're creating a more complicated game, create an application model using plain Java getter/setter classes.

I used Key Bindings to bind the right arrow key to the Action class. I used AbstractAction so I'd only have to code the actionPerformed method.

Here's the complete runnable code.

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");
        }
        
    }

}

Upvotes: 3

Related Questions