2012-03-27 4 views
2

Я пытаюсь нарисовать 5 карт на JPanel, но у меня проблемы с отображением изображений с карты.Проблема с множественными JLabels

JLabel[] cards = { 
     new JLabel(CARD_BACK), 
     new JLabel(CARD_BACK), 
     new JLabel(CARD_BACK), 
     new JLabel(CARD_BACK), 
     new JLabel(CARD_BACK) 
    }; 

    for(int i=0; i<cards.length; i++) { 
     cards[i].setBounds(60*i, 0, 150, 215); 
    } 

    for(JLabel z : cards) 
     auxHands.add(z); 

    auxHands.setLayout(null); 

Вышеприведенные отлично работает и привлекает 5 изображений карт, но при попытке конденсировать такой код:

JLabel[] cards = new JLabel[5]; 

    Arrays.fill(cards, new JLabel(CARD_BACK)); 

    for(int i=0; i<cards.length; i++) { 
     cards[i].setBounds(60*i, 0, 150, 215); 
    } 

    for(JLabel z : cards) 
     auxHands.add(z); 
    auxHands.setLayout(null); 

, кажется, только сделать последний экземпляр карты. В конце концов, я собираюсь рисовать несколько рук, и было бы утомительно продолжать создавать новый JLabel [], как в первом примере кода.

Вот визуальное представление о том, что я имею в виду: http://oipsl.freesuperhost.com/images/meh.png, верхняя половина показывает, как он выглядит, когда я выполняю первый фрагмент кода, а нижняя половина - это то, что похоже на второй фрагмент кода.

ответ

4

Этот код:

Arrays.fill(cards, new JLabel(CARD_BACK)); 

только создает одногоJLabel. Затем он использует ссылку на эту единственную метку для всех элементов в массиве ... следовательно, эффект, который вы получаете. Это эквивалентно:

// Equivalent bad code 
JLabel label = new JLabel(CARD_BACK); 
JLabel[] cards = { label, label, label, label, label }; 

Надеюсь, вы увидите, почему это не работает.

Вы должны использовать цикл, который может заполнять массив новыми ярлыками и одновременно устанавливать границы. Вы можете добавить его в auxHands в то же время тоже:

JLabel[] cards = new JLabel[5]; 
for (int i = 0; i < cards.length; i++) { 
    JLabel label = new JLabel(CARD_BACK); 
    label.setBounds(60*i, 0, 150, 215); 
    auxHands.add(label); 
    cards[i] = label; 
} 

Обратите внимание, что если вы не нуждаетесь в массиве в другом месте, вы можете избавиться от него полностью:

for (int i = 0; i < 5; i++) { 
    JLabel label = new JLabel(CARD_BACK); 
    label.setBounds(60*i, 0, 150, 215); 
    auxHands.add(label); 
} 
+0

спасибо за четкое и краткое объяснение ! – oipsl

Смежные вопросы