2017-09-25 100 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