[問題] itemStateChanged 事件處理 無法正常運作

看板java作者 (Bacon)時間15年前 (2010/10/06 00:57), 編輯推噓1(103)
留言4則, 3人參與, 最新討論串1/1
我做了一個JCombobox,只要點選 JCombobox 的選項,就會觸發 itemStateChanged 的 事件處理,將版面更換成所選取的版面。 但只要程式呼叫執行 itemStateChanged 並做 控制 panel的事情時,就會發生例外處理 停止程式執行,只要把控制panel的程式碼移除,一切又正常。 我翻了兩本視窗程式設計的書,皆找不到答案,所以跪求板上的神人大 大們,幫我解惑,拜託了!! 以下是我的程式碼:(itemStateChanged 在最下面) import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import javax.swing.border.Border; public class MainFrame implements ActionListener, ItemListener{ JFrame fr; Container contenpan; //功能表 JMenuBar mb; JMenu file; JMenuItem importt; JMenuItem exit; JMenu help; JMenuItem aboutMI; JMenuItem test; //對話方塊 //關於的對話方塊 JDialog aboutMIDl; //組合方塊 JPanel machinepan; JLabel machinename; JComboBox machinecmbbox; DefaultComboBoxModel cmbModel; //ComboboxModel //分頁用panel JPanel tabbedpanel; //分頁鏈結串列 ChiefpanelList chfpl = new ChiefpanelList(); MainFrame(){ fr = new JFrame("流量監測系統"); //呼叫創建功能表的函數 buildMenuBar(); //取得mainframe的contenpan並設定排版為border; contenpan = fr.getContentPane(); BorderLayout border = new BorderLayout(1,1); contenpan.setLayout(border); //呼叫創建監測機器列表的method buildmachinepan(); //呼叫創建分頁的method //buildTabbedPane(); fr.setVisible(true); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fr.pack(); } //設定功能表的函數 private void buildMenuBar(){ mb = new JMenuBar(); file = new JMenu("檔案"); importt = new JMenuItem("匯入"); exit = new JMenuItem("關閉"); mb.add(file); file.add(importt); file.add(exit); importt.addActionListener(this); exit.addActionListener(this); help = new JMenu("幫助"); aboutMI = new JMenuItem("關於.."); test = new JMenuItem("測試用"); mb.add(help); help.add(aboutMI); help.add(test); aboutMI.addActionListener(this); test.addActionListener(this); fr.setJMenuBar(mb); } //創建組合方塊函數 private void buildmachinepan(){ machinepan = new JPanel(new GridLayout(1,2)); machinename = new JLabel("未載入"); cmbModel = new DefaultComboBoxModel(){}; machinecmbbox = new JComboBox(); machinecmbbox.setModel(cmbModel); machinecmbbox.addItemListener(this); machinepan.add(machinename); machinepan.add(machinecmbbox); machinepan.setBorder(BorderFactory.createTitledBorder("監測機器")); contenpan.add(machinepan, BorderLayout.NORTH); } //創建分頁及列表的函數 private void buildTabbedPane()throws IOException{ //讀取路徑 FileReader fr = new FileReader("logpath.txt"); BufferedReader bfr = new BufferedReader(fr); //檢查是否結束 FileReader test = new FileReader("logpath.txt"); BufferedReader bfrtest = new BufferedReader(test); while(bfrtest.readLine() != null){ String n = bfr.readLine(); String p = bfr.readLine(); chfpl.inster(n, p); //第一次取得機器名稱 , 第二次readLine取得路徑 cmbModel.addElement(n); bfrtest.readLine();//測試是否結束用 的 第二次位移換行 } fr.close(); bfrtest.close(); tabbedpanel = new JPanel(); contenpan.add(tabbedpanel, BorderLayout.CENTER); //tabbedpanel.add(chfpl.front.link.chiefpan); } public void actionPerformed(ActionEvent e){ //測試是哪一種類別呼叫事件處理 Class ca1 = new JMenuItem().getClass(); if(ca1 == e.getSource().getClass()){ //測試是哪一個物件呼叫事件處理 if(e.getSource() == test){ System.out.print("test~~"); } else if(e.getSource() == aboutMI){ aboutMIDl = new JDialog(fr, "關於..", true); JLabel authorSchool = new JLabel( "靜宜大學-CSIE",JLabel.CENTER); aboutMIDl.add(authorSchool); aboutMIDl.pack(); aboutMIDl.show(); } else if(e.getSource() == importt){ //呼叫匯入路徑的物件 new setpath(fr); //呼叫建立監測機器分頁的路徑檔 try { buildTabbedPane(); } catch (IOException e1) {e1.printStackTrace();} this.fr.pack(); } else if(e.getSource() == exit){ } System.out.println("MenuBar is OK"); } } //組合方塊處發事件處理 public void itemStateChanged(ItemEvent e){ //若選取改變時處理 if(e.getStateChange() == ItemEvent.SELECTED){ String nametemp = (String)e.getItem(); System.out.println("nametemp = " + nametemp); machinename.setText((String)cmbModel.getSelectedItem()); //更換為所選取的版面 tabbedpanel.add(chfpl.search(nametemp).chiefpan, BorderLayout.CENTER); System.out.println("itemStateChanged is called"); } } } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.128.20.148 ※ 編輯: baconcsie 來自: 140.128.20.148 (10/06 00:58)

10/06 09:58, , 1F
有exception log嗎?
10/06 09:58, 1F

10/06 15:05, , 2F
看不懂,你說的是什麼意思?
10/06 15:05, 2F

10/06 20:32, , 3F
先確定你的 ChiefpanelList 實做是正確(無問題)的。
10/06 20:32, 3F

10/07 04:23, , 4F
問題已經解決了~感謝板上大大解答
10/07 04:23, 4F
文章代碼(AID): #1CgrZc5R (java)