[英]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.我试图通过单击按钮(actionEvent)来实现它,颜色将 label 更改为蓝色。 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.
如果单击带有右侧箭头的按钮,则如果再次单击该按钮,则右侧的 label 将从橙色变为蓝色,依此类推。 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.
如果单击左侧的按钮,则再次单击左侧的 label 将从橙色变为蓝色,依此类推。 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.在本实验中,您将创建一个类似于下图的 GUI。 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.
如果蓝色方块在 position 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;
}
} }
JLabel lblNewLabel = labelOne();
contentPane.add(lblNewLabel);
You create and add a label to the frame.您创建 label 并将其添加到框架。
But then in the ActionListener you have:但是在 ActionListener 你有:
JLabel[] jl = { labelOne(), labelTwo(), labelThree(), labelFour() };
which creates 4 new instances of each label.它为每个 label 创建 4 个新实例。 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.相反,您需要将 Array 定义为 class 的实例变量。 Then your ActionListener can access the label from the Array.
然后您的 ActionListener 可以从 Array 访问 label。
So in the constructor when you create and add the label to the frame you also need to add it to the Array.因此,在构造函数中,当您创建 label 并将其添加到框架时,您还需要将其添加到数组中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.