我正在尝试使按钮单击(actionEvent),颜色将标签更改为蓝色。我有四个不同的标签和两个按钮。如果单击带有向右箭头的按钮,则右侧的标签将从橙色变为蓝色,依此类推,如果再次单击该按钮,则以此类推。如果单击左侧的按钮,则左侧的标签将从橙色更改为蓝色,依此类推。我不知道我在动作侦听器中是否做错了什么,但是当单击按钮时什么也没有发生。我将在本段下面发布分配说明,所以希望它更有意义。
在本实验中,您将创建一个与下图类似的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;
}
}
答案 0 :(得分:1)
JLabel lblNewLabel = labelOne();
contentPane.add(lblNewLabel);
您创建一个标签并将其添加到框架。
但是在ActionListener中,您可以:
JLabel[] jl = { labelOne(), labelTwo(), labelThree(), labelFour() };
会为每个标签创建4个新实例。这些标签未添加到框架中,因此更改其背景无济于事。
相反,您需要将Array定义为该类的实例变量。然后,您的ActionListener可以从数组访问标签。
因此,在构造函数中,当您创建标签并将其添加到框架时,还需要将其添加到数组。