代码之家  ›  专栏  ›  技术社区  ›  biafas

JLabel的属性不变

  •  1
  • biafas  · 技术社区  · 7 年前

    我有一个名为boardGUI的类,它有一个包含64个标签的列表(就像一个棋盘)。每个标签对应于电路板上的特定瓷砖。

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

    setOpaque(true) 方法,每当我单击其中一个标签时(在mouseClicked方法内)。

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

    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;
                 }   
            }
    
        }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   JensS    7 年前

    您需要设置背景色和不透明性;下面是一个示例,展示了它们是如何协同工作的:

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

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