2013-03-05 84 views
1

我在使用Netbeans的JPanel的可见性方面存在问题;我做了一个简单的例子,告诉你发生了什么。当我设计组合和面板 - >直到“private void TheFrame(java.awt.event.WindowEvent evt)”时,Netbeans创建代码。JPanel#setVisible无法正常工作。

在windowActivated的框架中,我把panelOne(JPanel).setVisible(false)和 这个工程! 从组合中选择一个项目(item2/item4)后,我想要显示panelOne,但这不起作用。

/** 
* 
* @author Alessandro 
*/ 
public class UIFrame extends javax.swing.JFrame { 

    /** 
    * Creates new form UIFrame 
    */ 
    public UIFrame() { 
     initComponents(); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     panelOne = new javax.swing.JPanel(); 
     comboBox = new javax.swing.JComboBox(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     addWindowListener(new java.awt.event.WindowAdapter() { 
      public void windowActivated(java.awt.event.WindowEvent evt) { 
       TheFrame(evt); 
      } 
     }); 

     javax.swing.GroupLayout panelOneLayout = new javax.swing.GroupLayout(panelOne); 
     panelOne.setLayout(panelOneLayout); 
     panelOneLayout.setHorizontalGroup(
      panelOneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 349, Short.MAX_VALUE) 
     ); 
     panelOneLayout.setVerticalGroup(
      panelOneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 52, Short.MAX_VALUE) 
     ); 

     comboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); 
     comboBox.addItemListener(new java.awt.event.ItemListener() { 
      public void itemStateChanged(java.awt.event.ItemEvent evt) { 
       ItemListener(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addGroup(layout.createSequentialGroup() 
         .addGap(30, 30, 30) 
         .addComponent(panelOne, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
        .addGroup(layout.createSequentialGroup() 
         .addGap(122, 122, 122) 
         .addComponent(comboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 143, javax.swing.GroupLayout.PREFERRED_SIZE))) 
       .addContainerGap(21, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(comboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(33, 33, 33) 
       .addComponent(panelOne, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(175, Short.MAX_VALUE)) 
     ); 

     pack(); 
    }// </editor-fold>       

    private void TheFrame(java.awt.event.WindowEvent evt) {       
     panelOne.setVisible(false); 
    }       

    private void ItemListener(java.awt.event.ItemEvent evt) {        
     String test = (String)(evt.getItem()); 
     switch (test) 
     { 
      case "Item1": 
       panelOne.setVisible(false); 
      case "Item2": 
       panelOne.setVisible(true); 
      case "Item3": 
       panelOne.setVisible(false); 
      case "Item4": 
       panelOne.setVisible(true); 
     }    
    }        

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(UIFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(UIFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(UIFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(UIFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new UIFrame().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify      
    private javax.swing.JComboBox comboBox; 
    private javax.swing.JPanel panelOne; 
    // End of variables declaration     
} 
+0

请粘贴完整的代码。您是否将组合框添加到面板? – Ankit 2013-03-05 19:01:41

+0

不,组合框在面板外 – Alpan67 2013-03-05 19:02:45

回答

3

您的switch-case不正确。你的情况有错误的字符串,你也错过了break语句。

您已经添加的项目是

"Item 1", "Item 2", "Item 3" and "Item 4" 

而在开关的情况下,你是比较

"item1", "item2", "item3" and "item4" 

其次,我认为问题的一部分是你得到的选择方式串。尝试使用此方法,而不是:

private void ItemListener(java.awt.event.ItemEvent evt) { 
    String test = (String) (evt.getItem()); //do not use this 
    System.out.println(test); 

    JComboBox box = (JComboBox)evt.getSource(); 
    String selectedString = (String) box.getSelectedItem(); 

    switch (selectedString) { //replaced test with selectedString 
    case "Item 1": 
     panelOne.setVisible(false); break; 
    case "Item 2": 
     panelOne.setVisible(true); break; 
    case "Item 3": 
     panelOne.setVisible(false); break; 
    case "Item 4": 
     panelOne.setVisible(true); break; 
    } 
} 

我希望这可以帮助。问题的原因可能在于,当您更改组合框中的项目时,项目选择更改事件会被触发两次。首先,取消选择的项目,然后选择所选的项目。

正如您所见,我已为test和新的selectedString变量添加了println()变量。现在,如果您当前的选择是“项目1”,并且选择了“项目3”,那么两个ItemEvent将被触发,test的值在两种情况下会有所不同,因为它涉及不同的项目,而选定的项目将是相同,你可能会想要。

PS:这就是为什么你需要break语句。 当你写:

switch(var){ 
case 1: doOne(); 
case 2: doTwo(); 
case 3: doThree(); 
} 

时会发生什么case 1成功的是它下面的所有这些情况不检查,并会按顺序执行。所以,doOne()doTwo()doThree()将全部执行。

switch(var){ 
case 1: doOne(); break; 
case 2: doTwo(); break; 
case 3: doThree(); break; 
} 

这里做的事情是,每当一个案件成功并执行其相应的代码,break将终止switch-case从而只执行要执行的代码。

为了避免这种情况,你需要使用break语句:

而且,这里是代码,我有

import java.awt.BorderLayout; 

import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class UIFrame extends JFrame { 
    final private JPanel panelOne = new JPanel(); 
    private JComboBox comboBox; 

    public UIFrame() { 
     initComponents(); 
    } 

    private void initComponents() { 
     setLayout(new BorderLayout()); 
     comboBox = new javax.swing.JComboBox(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     comboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { 
       "Item 1", "Item 2", "Item 3", "Item 4" })); 
     comboBox.addItemListener(new java.awt.event.ItemListener() { 
      public void itemStateChanged(java.awt.event.ItemEvent evt) { 
       ItemListener(evt); 
      } 
     }); 
     panelOne.add(new JTextField("Hello")); 
     add(comboBox, BorderLayout.CENTER); 
     add(panelOne, BorderLayout.NORTH); 

    } 


    private void ItemListener(java.awt.event.ItemEvent evt) { 
     panelOne.setVisible(false); 
     String test = (String) (evt.getItem()); 
     System.out.println(test); 

     JComboBox box = (JComboBox)evt.getSource(); 
     String selectedString = (String) box.getSelectedItem(); 

     switch (selectedString) { 
     case "Item 1": 
      panelOne.setVisible(false); 
      break; 
     case "Item 2": 
      panelOne.setVisible(true); 
      break; 
     case "Item 3": 
      panelOne.setVisible(false); 
      break; 
     case "Item 4": 
      panelOne.setVisible(true); 
      break; 
     } 



    } 

    public static void main(String[] args) { 
     final UIFrame frame = new UIFrame(); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

是的,你是对的,但这不是问题;我改变了字符串,它是一样的。面板没有出现 – Alpan67 2013-03-05 19:14:07

+0

我不知道......就像它不起作用 – Alpan67 2013-03-05 19:22:23

+0

顺便说一下,你现在的代码中,字符串仍然是错误的。你错过了空间。使用“Item 1”而不是“Item1” – Ankit 2013-03-05 19:27:17

0

如果使用if ...else而不是switch Statement话,那就更容易编码和也明白,如果你是新的Java语言。

只是尝试这个代码在的JComboBox事件

private void jComboBox1ItemStateChanged(java.awt.event.ItemEvent evt) { 
     PanelChange(); 
    } 


private void PanelChange() { 
     String test = jComboBox1.getSelectedItem().toString(); 
     if (test.equals("Item 1") || test.equals("Item 3")) { 
      jPanel1.setVisible(false); 
     }else{ 
      jPanel1.setVisible(true); 
     } 
    } 

之所以创建PanelChange()是,在第一次“项目1”是一个选择的项目,并根据您的报表时“项目1”被选中,那么的JPanel是不可见的,你必须在构造函数中复制此方法,如:

public UIFrame() { 
     initComponents(); 
     PanelChange(); 
    }