2013-07-27 2 views
2

у меня есть JPanel как:не в состоянии определить текущую видимую карту в CardLayout

public class CardLayoutPanel extends JPanel { 
String[] option = {"login", "register"}  
public CardLayoutPanel() { 
    super(); 
    combo_box = new JComboBox(option); 
    login_panel = new LoginForm(); 
    register_panel = new RegisterForm(); 

    layout = new CardLayout(); 
    this.setLayout(new BorderLayout()); 
    panel = new JPanel(); 
    panel.setLayout(layout); 

    this.add(combo_box, BorderLayout.NORTH); 
    this.add(panel, BorderLayout.SOUTH); 

    panel.add(login_panel, "login"); 
    panel.add(register_panel, "register"); 

    layout.show(panel, "login"); 
    combo_box.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      JComboBox source = (JComboBox) e.getSource(); 

      if(source.getSelectedItem().equals("login")) { 
       layout.show(panel, "login"); 
      }else if(source.getSelectedItem().equals("register")) { 
       layout.show(panel, "register"); 
      } 
     } 
    }); 
} 

}

и я звонить из моего главного Calss внутри JOptionPane

CardLayoutPanel card_panel = new CardLayoutPanel(); 

    int res = JOptionPane.showConfirmDialog(null, card_panel, "Login/Registrati",JOptionPane.OK_CANCEL_OPTION); 

Теперь, если я попытайтесь получить текущую видимую карточку, такую ​​как

if(res == JOptionPane.OK_OPTION) { 
     for(Component comp : card_panel.getComponents()) { 
      if(comp.isVisible() == true) { 
       JPanel current_panel = (JPanel) comp; 

       System.out.println(current_panel.getName()); 
      } 
     } 
    }else if(res == JOptionPane.CANCEL_OPTION) { 
     System.exit(-1); 
    } 

я получить ошибку секвенции:

Exception in thread "main" java.lang.ClassCastException: javax.swing.JComboBox cannot be cast to javax.swing.JPanel

на этой строке внутри для каждого оператора:

JPanel current_panel = (JPanel) comp; 

, как я могу это исправить?

+0

'' как я могу это исправить? "' - не бросайте JComboBox в JPanel. Передайте его JComboBox и используйте его как JComboBox. –

+0

, но зачем он вставлял компонент в JComboBox, а не в Jpanel? – giozh

+0

'но зачем он вставлял компонент в JComboBox, а не в Jpanel?' - Ваш код неправильный, и вы не разместили SSCCE, поэтому мы не можем сказать вам, что не так. – camickr

ответ

3

Я бы просто получил JComboBox и запросил его выбранный элемент. Предполагая, что класс, который держит JComboBox имеет метод сказать называется, getComboBox():

JComboBox combo = getComboBox(); 
String selectedItem = combo.getSelectedItem().toString(); 
System.out.println(selectedItem); 

В качестве альтернативы и, вероятно, лучше для класса, который содержит поле со списком, чтобы иметь метод, который не выставляет сам выпадающий но позволяет другие классы для запроса выпадающего списка для выбранного элемента.

public Object getComboBoxSelection() { 
    combo_box.getSelectedItem(); 
} 

А затем внешние классы могут называть этот метод действительной ссылкой.

+0

да, он отлично работает. спасибо – giozh

+1

@giozh: рад, что у вас это работает. –

3

Не знаете, что вы используете CardLayout правильно. Я не знаю, почему вы добавляете CardLayout в JOptionPane. Я бы просто добавил панель, которую вы хотите отобразить.

Но если вы действительно хотите узнать карту в настоящее время в CardLayout, то проверьте Card Layout Focus, у которой есть способ сделать это.

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