2017-09-25 76 views
1

我有一个类,叫做boardGUI,它有64个标签(如棋盘)的列表。每个标签都包含在电路板上的特定磁贴上。JLabel`s财产不`吨更改

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

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

    } 
+0

您是否设置了标签的背景颜色? – JensS

+0

你是如何获得包含标签的类的实例的?看起来你可能正在处理包含64个标签的类的不同实例。此外,您的labelList不是静态的,这意味着内存中可能存在多个列表实例。 –

+0

@NaveedKamran。我试图将更改应用于标签的类实际上是GUI的控制器。 '私人BoardGUI boardGUI =新BoardGUI();' – Tudor

回答

1

您需要同时设置背景颜色和不透明度;这里有一个例子来说明如何将这些一起玩:

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,则变为蓝色和不透明和回用鼠标点击每一个。所以基本上,你需要设置背景颜色与不透明(红色只是为了证明它从来没有显示,因为标签从来都不透明和红色)。

+0

谢谢。还有一个问题,当我尝试在BoardGUI类(我在其中创建标签)中设置不透明度时,实际上会使标签不透明,而不设置背景颜色? – Tudor

+0

opaque的默认值为false,但根据setOpaque的文档,对于大多数组件来说它是“外观和感觉相关的”;所以如果它在你的应用程序中是真的(没有你设置它),这可能是由于UIManager。 – JensS