[問題] itemStateChanged 事件處理 無法正常運作
我做了一個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
10/06 09:58, 1F
→
10/06 15:05, , 2F
10/06 15:05, 2F
→
10/06 20:32, , 3F
10/06 20:32, 3F
→
10/07 04:23, , 4F
10/07 04:23, 4F