JLabel 的 属性 没有改变
JLabel`s property doesn`t change
我有一个 class ,叫做 boardGUI ,它有一个包含 64 个标签的列表(就像一个棋盘)。每个标签对应板上的特定图块。
List<JLabel> labelList = new ArrayList<>();
在另一个 class 中,每当我单击其中一个标签(在 mouseClicked 方法内)时,我试图使用 setOpaque(true)
方法将其中一些标签设置为不透明。
JLabel l1 = boardGUI.labelList.get(1);
l1.setOpaque(true);
问题是尽管 l1 在 labelList 中引用了正确的标签(我用调试器检查过),但它并没有做出任何视觉上的改变(在 GUI 上)。
但是,如果我尝试在 boardGUI class 中设置标签的不透明度,它会起作用。
for (int i=0;i<64;i++)
labelList.get(i).setOpaque(true);
问题出在哪里?
这是我尝试应用更改的 class :
public class Controller {
private Board board = new Board();
private BoardGUI boardGUI = new BoardGUI();
public Controller () {
boardGUI.setVisible(true);
boardGUI.addLabelListener(new LabelListener());
}
class LabelListener implements MouseListener{
@Override
public void mouseClicked(MouseEvent arg0) {
JLabel l1 = boardGUI.labelList.get(1);
l1.setOpaque(true);
}
BoardGUI class(还有更多代码,但不相关):
public class BoardGUI extends JFrame{
List<JLabel> labelList = new ArrayList<>();
public BoardGUI() {
createView();
}
public void createView() {
createLabels(mainPanel);
}
public void createLabels(JPanel mainPanel) {
int startX = 100;
int startY = 87;
int x = 100;
int y = 87;
int j = 0;
for (int i=0;i<64;i++) {
JLabel label = new JLabel();
label.setBounds(x , y , 62, 62);
labelList.add(label);
mainPanel.add(label);
if ( (i == 7*(j+1) +j )) {
x = startX;
y = startY + 62 *( i / 7);
j=j+1;
}
else {
x = x+62;
}
}
}
您需要同时设置背景颜色和不透明度;这里有一个例子来展示它们是如何一起发挥作用的:
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
frame.getContentPane().setBackground(Color.GREEN);
JLabel label1 = new JLabel("label1");
label1.setBackground(Color.RED);
label1.setOpaque(false);
frame.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
label1.setOpaque(!label1.isOpaque());
label1.setBackground(label1.getBackground() == Color.RED ? Color.BLUE : Color.RED);
}
public void mouseReleased(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
});
frame.add(label1);
frame.pack();
frame.setVisible(true);
}
标签最初是透明的,然后变为蓝色且不透明,然后随着每次鼠标单击而变回。所以基本上,您需要将背景颜色与不透明一起设置(红色只是为了证明它永远不会显示,因为标签永远不会既不透明又不透明)。
我有一个 class ,叫做 boardGUI ,它有一个包含 64 个标签的列表(就像一个棋盘)。每个标签对应板上的特定图块。
List<JLabel> labelList = new ArrayList<>();
在另一个 class 中,每当我单击其中一个标签(在 mouseClicked 方法内)时,我试图使用 setOpaque(true)
方法将其中一些标签设置为不透明。
JLabel l1 = boardGUI.labelList.get(1);
l1.setOpaque(true);
问题是尽管 l1 在 labelList 中引用了正确的标签(我用调试器检查过),但它并没有做出任何视觉上的改变(在 GUI 上)。
但是,如果我尝试在 boardGUI class 中设置标签的不透明度,它会起作用。
for (int i=0;i<64;i++)
labelList.get(i).setOpaque(true);
问题出在哪里?
这是我尝试应用更改的 class :
public class Controller {
private Board board = new Board();
private BoardGUI boardGUI = new BoardGUI();
public Controller () {
boardGUI.setVisible(true);
boardGUI.addLabelListener(new LabelListener());
}
class LabelListener implements MouseListener{
@Override
public void mouseClicked(MouseEvent arg0) {
JLabel l1 = boardGUI.labelList.get(1);
l1.setOpaque(true);
}
BoardGUI class(还有更多代码,但不相关):
public class BoardGUI extends JFrame{
List<JLabel> labelList = new ArrayList<>();
public BoardGUI() {
createView();
}
public void createView() {
createLabels(mainPanel);
}
public void createLabels(JPanel mainPanel) {
int startX = 100;
int startY = 87;
int x = 100;
int y = 87;
int j = 0;
for (int i=0;i<64;i++) {
JLabel label = new JLabel();
label.setBounds(x , y , 62, 62);
labelList.add(label);
mainPanel.add(label);
if ( (i == 7*(j+1) +j )) {
x = startX;
y = startY + 62 *( i / 7);
j=j+1;
}
else {
x = x+62;
}
}
}
您需要同时设置背景颜色和不透明度;这里有一个例子来展示它们是如何一起发挥作用的:
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
frame.getContentPane().setBackground(Color.GREEN);
JLabel label1 = new JLabel("label1");
label1.setBackground(Color.RED);
label1.setOpaque(false);
frame.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
label1.setOpaque(!label1.isOpaque());
label1.setBackground(label1.getBackground() == Color.RED ? Color.BLUE : Color.RED);
}
public void mouseReleased(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
});
frame.add(label1);
frame.pack();
frame.setVisible(true);
}
标签最初是透明的,然后变为蓝色且不透明,然后随着每次鼠标单击而变回。所以基本上,您需要将背景颜色与不透明一起设置(红色只是为了证明它永远不会显示,因为标签永远不会既不透明又不透明)。