2016-01-03 5 views
0

Я создал JButton, на который, если я нажму, отобразится карта. Каждый раз, когда я нажимаю эту кнопку, предполагается, что появится следующая карта того же костюма, и этот процесс должен продолжаться до тех пор, пока не будут показаны все 13 карт одного и того же костюма. Я показываю карты в виде изображений на ImageIcon в JLabel. Проблема в том, что если я хочу отображать все карты в одном и том же месте, первая карта не удаляется со своего места, скрывая остальную часть 12 карт под собой. Это означает, что каждая новая карта, которая должна отображаться, подпадает под ее прецедентную карту. Я попытался удалить карту прецедента из JLabel с помощью frame.remove (mylabel); метод. Но это не помогло. Более того, если я изменяю координаты в методе setBound(), карта отображается. Но я хочу отобразить карту в том же месте, где была показана первая карта. Я использовал счетчик для перехода к следующей карте. Каждый раз, когда отображается карта, она увеличивает приращение переменной счетчика, в конечном итоге переходит к следующей карте. Пожалуйста, расскажите, как я могу удалить предыдущую карту, чтобы отобразить следующую карту. Я использовал всю логику отображения карты внутри метода ActionListener. JFrame и JButton объявляются вне этого метода ActinListener. Мой код приведен ниже:Удаление изображения из JLabel в JFrame

my_btn.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       ImageIcon pic = new ImageIcon(); 
       JLabel lbl = new JLabel(); 

       if(counter == 0) { 
        pic = new ImageIcon(c1); 
        lbl = new JLabel(pic); 
        frame.add(lbl); 
        lbl.setBounds(200, 100, 100, 100); 
        lbl.setVisible(true); 
        counter++; 
       } 
       else if(counter == 1) { 
        frame.remove(lbl); 
        lbl.setVisible(false); 
        pic = new ImageIcon(c2); 
        lbl = new JLabel(pic); 
        frame.add(lbl); 
        lbl.setBounds(200, 100, 100, 100); 
        lbl.setVisible(true); 
        counter++; 
       } 
       else if(counter == 2) { 
        frame.remove(lbl); 
        lbl.setVisible(false); 
        pic = new ImageIcon(c3); 
        lbl = new JLabel(pic); 
        frame.add(lbl); 
        lbl.setBounds(200, 100, 100, 100); 
        lbl.setVisible(true); 
        counter++; 
       } 
       else if(counter == 3) { 
        frame.remove(lbl); 
        lbl.setVisible(false); 
        pic = new ImageIcon(c4); 
        lbl = new JLabel(pic); 
        frame.add(lbl); 
        lbl.setBounds(200, 100, 100, 100); 
        lbl.setVisible(true); 
        counter++; 
       } 
       else if(counter == 4) { 
        frame.remove(lbl); 
        lbl.setVisible(false); 
        pic = new ImageIcon(c5); 
        lbl = new JLabel(pic); 
        frame.add(lbl); 
        lbl.setBounds(200, 100, 100, 100); 
        lbl.setVisible(true); 
        counter++; 
       } 
       else if(counter == 5) { 
        frame.remove(lbl); 
        lbl.setVisible(false); 
        pic = new ImageIcon(c6); 
        lbl = new JLabel(pic); 
        frame.add(lbl); 
        lbl.setBounds(200, 100, 100, 100); 
        lbl.setVisible(true); 
        counter++; 
       } 
       else if(counter == 6) { 
        frame.remove(lbl); 
        lbl.setVisible(false); 
        pic = new ImageIcon(c7); 
        lbl = new JLabel(pic); 
        frame.add(lbl); 
        lbl.setBounds(200, 100, 100, 100); 
        lbl.setVisible(true); 
        counter++; 
       } 
       else if(counter == 7) { 
        frame.remove(lbl); 
        lbl.setVisible(false); 
        pic = new ImageIcon(c8); 
        lbl = new JLabel(pic); 
        frame.add(lbl); 
        lbl.setBounds(200, 100, 100, 100); 
        lbl.setVisible(true); 
        counter++; 
       } 
       else if(counter == 8) { 
        frame.remove(lbl); 
        lbl.setVisible(false); 
        pic = new ImageIcon(c9); 
        lbl = new JLabel(pic); 
        frame.add(lbl); 
        lbl.setBounds(200, 100, 100, 100); 
        lbl.setVisible(true); 
        counter++; 
       } 
       else if(counter == 9) { 
        frame.remove(lbl); 
        lbl.setVisible(false); 
        pic = new ImageIcon(c10); 
        lbl = new JLabel(pic); 
        frame.add(lbl); 
        lbl.setBounds(200, 100, 100, 100); 
        lbl.setVisible(true); 
        counter++; 
       } 
       else if(counter == 10) { 
        frame.remove(lbl); 
        lbl.setVisible(false); 
        pic = new ImageIcon(cj); 
        lbl = new JLabel(pic); 
        frame.add(lbl); 
        lbl.setBounds(200, 100, 100, 100); 
        lbl.setVisible(true); 
        counter++; 
       } 
       else if(counter == 11) { 
        frame.remove(lbl); 
        lbl.setVisible(false); 
        pic = new ImageIcon(cq); 
        lbl = new JLabel(pic); 
        frame.add(lbl); 
        lbl.setBounds(200, 100, 100, 100); 
        lbl.setVisible(true); 
        counter++; 
       } 
       else if(counter == 12) { 
        frame.remove(lbl); 
        lbl.setVisible(false); 
        pic = new ImageIcon(ck); 
        lbl = new JLabel(pic); 
        frame.add(lbl); 
        lbl.setBounds(200, 100, 100, 100); 
        lbl.setVisible(true); 
        counter++; 
       } 
       else { 
        frame.remove(lbl); 
        lbl.setVisible(false); 
        JOptionPane.showMessageDialog(frame, "Card deck ends."); 
       } 
      } 
     }); 

ответ

2

При добавлении или удалении компонента из видимого GUI основная логика:

panel.remove(...); 
panel.revalidate(); 
panel.repaint(); 

Однако, я не знаю, как вы показываете несколько карт в в том же месте, поскольку менеджеры макета по умолчанию имеют размер 2, поэтому вы не можете складывать компоненты, если не используете Overlaylayout.

Другие варианты:

  1. Используйте CardLayout, то вы можете контролировать, какие карты в настоящее время виден.
  2. Используйте один JLabel. Затем вы можете просто изменить Icon ярлыка, если хотите изменить карту. Это, вероятно, самое простое решение, так как ваш текущий код создает ярлык с иконкой. Поэтому не создавайте ярлык и просто меняйте значок.

Вы должны играть в setBounds(). Менеджер компоновки определит местоположение каждого компонента.

Вы также можете попробовать использовать Overlap Layout, который похож на OverLayLayout, но был разработан для такого макета.

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