Search code examples
javaswingjpaneljbuttonjlabel

I have 4 different JLabels and two buttons one button should change the color to the right to blue and the other button changes the color back


I am trying to make it so on a button click (actionEvent) the color changes the label to blue. I have four different labels and two buttons. if the button with the arrow to the right is clicked then the label to the right changes from orange to blue and so on if the button is clicked again. If the button to the left is clicked then the label to the left changes from orange to blue and so on if clicked again. I don't know if I am doing something wrong in the action listeners, but when the buttons are clicked nothing happens.I will post the assignment instructions below this paragraph, so hopefully it makes more sense.

In this lab, you will create a GUI that looks similar to the image below. On the left, you have a control panel that includes two buttons: one with a left-arrow and one with a right-arrow. Whenever you click the right arrow, the blue tile moves to the right (the numbers remain unchanged) Whenever you click the left arrow, the blue tile moves to the left. If the blue tile is on position 1 and the left arrow is clicked, the blue tile is moved to the very right (position 4) Something analogous is true for the right arrow.

Desired Output:

package guiLayout;

/**
 * In this JFrame my goal is to be able to make the color of the labels
 * change on the JButton click with an action listener.
 * 
 * @author Kody Berry
 * @since 7-4-2020
 */

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.Color;
import javax.swing.JButton;
import java.awt.Font;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class LabGuiLayout extends JFrame {
// Fields
private static final long serialVersionUID = 1L;
private JPanel contentPane;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                LabGuiLayout frame = new LabGuiLayout();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public LabGuiLayout() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 500, 200);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    // Creating instances of methods and adding it to JPannel.
    JButton btnNewButton = moveLeftButton();
    contentPane.add(btnNewButton);

    JLabel lblNewLabel = labelOne();
    contentPane.add(lblNewLabel);

    JLabel lblNewLabel_1 = labelTwo();
    contentPane.add(lblNewLabel_1);

    JLabel lblNewLabel_2 = labelThree();
    contentPane.add(lblNewLabel_2);

    JButton button = moveRightButton();
    contentPane.add(button);

    JLabel label = labelFour();
    contentPane.add(label);

    JLabel lblNewLabel_3 = demoLayoutLabel();
    contentPane.add(lblNewLabel_3);
}

/**
 * Title Label.
 * 
 * @return Returns lblNewLabel_3.
 */
private JLabel demoLayoutLabel() {
    JLabel lblNewLabel_3 = new JLabel("Demo Layout");
    lblNewLabel_3.setFont(new Font("Tahoma", Font.PLAIN, 23));
    lblNewLabel_3.setHorizontalAlignment(SwingConstants.CENTER);
    lblNewLabel_3.setOpaque(true);
    lblNewLabel_3.setBounds(0, 0, 490, 46);
    return lblNewLabel_3;
}

/**
 * Number 1 label.
 * 
 * @return Returns lblNewLabel.
 */
private JLabel labelOne() {
    JLabel lblNewLabel = new JLabel(" 1");
    lblNewLabel.setFont(new Font("Tahoma", Font.PLAIN, 26));
    lblNewLabel.setOpaque(true);
    lblNewLabel.setBounds(91, 45, 86, 93);
    lblNewLabel.setBackground(Color.BLUE);
    lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
    return lblNewLabel;
}

/**
 * Number 2 label.
 * 
 * @return Returns lblNewLabel_1.
 */
private JLabel labelTwo() {
    JLabel lblNewLabel_1 = new JLabel("2");
    lblNewLabel_1.setFont(new Font("Tahoma", Font.PLAIN, 26));
    lblNewLabel_1.setOpaque(true);
    lblNewLabel_1.setBounds(187, 45, 86, 93);
    lblNewLabel_1.setBackground(Color.ORANGE);
    lblNewLabel_1.setHorizontalAlignment(SwingConstants.CENTER);
    return lblNewLabel_1;
}

/**
 * Number 3 label.
 * 
 * @return Returns lblNewLabel_2.
 */
private JLabel labelThree() {
    JLabel lblNewLabel_2 = new JLabel("3");
    lblNewLabel_2.setFont(new Font("Tahoma", Font.PLAIN, 26));
    lblNewLabel_2.setOpaque(true);
    lblNewLabel_2.setBounds(283, 45, 86, 93);
    lblNewLabel_2.setBackground(Color.ORANGE);
    lblNewLabel_2.setHorizontalAlignment(SwingConstants.CENTER);
    return lblNewLabel_2;
}

/**
 * Number 4 label.
 * 
 * @return Returns label.
 */
private JLabel labelFour() {
    JLabel label = new JLabel("4");
    label.setFont(new Font("Tahoma", Font.PLAIN, 26));
    label.setOpaque(true);
    label.setHorizontalAlignment(SwingConstants.CENTER);
    label.setBackground(Color.ORANGE);
    label.setBounds(379, 45, 86, 93);
    return label;
}

/**
 * Move to the left button that when clicked will change the button to the left
 * to blue and the previous button to orange. Once the last label on the left is
 * blue if the button is clicked again it will start over.
 * 
 * @return Returns btnNewButton.
 */
private JButton moveLeftButton() {

    // Array of labels.
    JLabel[] jl = { labelOne(), labelTwo(), labelThree(), labelFour() };

    JButton btnNewButton = new JButton("<--");

    btnNewButton.addActionListener(new ActionListener() {
        int clicks = 0;

        public void actionPerformed(ActionEvent e) {
            switch (++clicks) {
            case 1:
                jl[0].setBackground(Color.ORANGE);
                jl[3].setBackground(Color.BLUE);
                break;
            case 2:
                jl[3].setBackground(Color.ORANGE);
                jl[2].setBackground(Color.BLUE);
                break;
            case 3:
                jl[2].setBackground(Color.ORANGE);
                jl[1].setBackground(Color.BLUE);
                break;
            case 4:
                jl[1].setBackground(Color.BLUE);
                jl[0].setBackground(Color.ORANGE);
                break;
            default:
                clicks = 1;
                break;
            }

        }
    });
    btnNewButton.setBounds(32, 45, 49, 23);
    return btnNewButton;
}

/**
 * Move to the right button that when clicked will change the button to the
 * right to blue and the previous button to orange. Once the last label on the
 * right is blue if the button is clicked again it will start over.
 * 
 * @return Returns button.
 */
private JButton moveRightButton() {

    // Array of labels.
    JLabel[] jl = { labelOne(), labelTwo(), labelThree(), labelFour() };

    JButton button = new JButton("-->");

    button.addActionListener(new ActionListener() {
        int clicks = 0;

        public void actionPerformed(ActionEvent e) {
            switch (++clicks) {
            case 1:
                jl[0].setBackground(Color.ORANGE);
                jl[1].setBackground(Color.BLUE);
                break;
            case 2:
                jl[1].setBackground(Color.ORANGE);
                jl[2].setBackground(Color.BLUE);
                break;
            case 3:
                jl[2].setBackground(Color.ORANGE);
                jl[3].setBackground(Color.BLUE);
                break;
            case 4:
                jl[0].setBackground(Color.BLUE);
                jl[1].setBackground(Color.ORANGE);
                break;
            default:
                clicks = 1;
                break;
            }
        }
    });
    button.setBounds(32, 79, 49, 23);
    return button;
}

}


Solution

  • JLabel lblNewLabel = labelOne();
    contentPane.add(lblNewLabel);
    

    You create and add a label to the frame.

    But then in the ActionListener you have:

    JLabel[] jl = { labelOne(), labelTwo(), labelThree(), labelFour() };
    

    which creates 4 new instances of each label. These labels are not added to the frame, so changing their background does nothing.

    Instead you need to define your Array as an instance variable of the class. Then your ActionListener can access the label from the Array.

    So in the constructor when you create and add the label to the frame you also need to add it to the Array.