我有一个名为boardGUI的类,它具有64个标签的列表(如国际象棋棋盘)。每个标签都与板上的特定磁贴相对应。

List<JLabel> labelList = new ArrayList<>();


在另一个类中,每当我单击其中一个标签(在mouseClicked方法内部)时,我都尝试使用setOpaque(true)方法将某些标签设置为不透明。

JLabel l1 = boardGUI.labelList.get(1);
l1.setOpaque(true);


问题是,尽管l1在labelList中引用了正确的标签(我已通过调试器检查),但它并没有进行任何可视化更改(在GUI上)。

但是,如果我尝试在boardGUI类中设置标签的不透明度,则可以正常工作。

for (int i=0;i<64;i++)
   labelList.get(i).setOpaque(true);


问题出在哪里?

这是我尝试应用更改的类:

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类(还有更多代码,但不相关):

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


标签最初是透明的,然后变为蓝色和不透明,并在每次MouseClick时返回。因此,基本上,您需要将背景色与不透明色一起设置(红色是为了证明它永远不会显示,因为标签永远不会是不透明的和红色)。

关于java - JLabel的属性不变,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46403084/

10-10 21:50