2013-03-05 85 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(); 
    }