У меня есть 4 разных JLabels и две кнопки, одна кнопка должна изменить цвет справа на синий, а другая кнопка меняет цвет обратно - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь сделать так, чтобы при нажатии кнопки (actionEvent) цвет менял метку на синий. У меня четыре разных ярлыка и две кнопки. если щелкнуть кнопку со стрелкой вправо, то метка справа изменится с оранжевого на синий и так далее, если кнопку щелкнуть снова. Если нажать кнопку слева, метка слева изменится с оранжевого на синий и т. Д. При повторном нажатии. Я не знаю, делаю ли я что-то не так в слушателях действий, но когда нажимаются кнопки, ничего не происходит. Я опубликую инструкции по назначению под этим абзацем, так что, надеюсь, это имеет больше смысла.

lab, вы создадите GUI, похожий на изображение ниже. Слева расположена панель управления с двумя кнопками: одна со стрелкой влево, а другая - со стрелкой вправо. Каждый раз, когда вы щелкаете стрелку вправо, синяя плитка перемещается вправо (числа остаются неизменными). Каждый раз, когда вы щелкаете стрелку влево, синяя плитка перемещается влево. Если синяя плитка находится в позиции 1 и нажата стрелка влево, синяя плитка перемещается в самое правое положение (позиция 4). Аналогичное верно для стрелки вправо.

Желаемый результат:

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

}

1 Ответ

1 голос
/ 13 июля 2020
JLabel lblNewLabel = labelOne();
contentPane.add(lblNewLabel);

Вы создаете и добавляете метку к фрейму.

Но затем в ActionListener у вас есть:

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

, который создает 4 новых экземпляра каждой метки. Эти метки не добавляются к фрейму, поэтому изменение их фона ничего не делает.

Вместо этого вам нужно определить свой массив как переменную экземпляра класса. Тогда ваш ActionListener сможет получить доступ к метке из массива.

Итак, в конструкторе, когда вы создаете и добавляете метку к фрейму, вам также необходимо добавить ее в массив.

...