簡體   English   中英

JLabel 的屬性不會改變

[英]JLabel`s property doesn`t change

我有一個名為 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);
}

標簽最初是透明的,然后隨着每次鼠標點擊變為藍色和不透明,然后返回。 所以基本上,您需要將背景顏色與不透明一起設置(紅色只是為了證明它永遠不會顯示,因為標簽永遠不會同時是不透明和紅色)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM