2012-01-31 27 views
0

我正在使用swing編寫java應用程序,該應用程序使用JTable來顯示文件中的數據。我創建了ActionListener來處理在JTable中添加新數據的過程。在我的應用程序中,JButton使用這個ActionListener,並且它完美地工作。但是,當我將相同的ActionListener綁定到JMenuBar中的按鈕時,某些操作不起作用。有一些操作 - 應用程序從文件加載數據,但JTable完全沒有改變。它會是什麼? 代碼:JMenuBar中的按鈕無法在JTable中更改數據

//button that works. It locates in constructor 
    ... 
    b1.addActionListener(bl); 
    ... 
    //button that loads data from file, but can't update table 
    ... 
     public JMenuBar createMenuBar() { 
     JMenuBar menuBar; 
     JMenu menu, submenu; 
     JMenuItem menuItem; 

     // Create the menu bar. 
     menuBar = new JMenuBar(); 

     // Build the first menu. 
     menu = new JMenu("File"); 
     menu.setMnemonic(KeyEvent.VK_A); 
     menu.getAccessibleContext().setAccessibleDescription(
       "The only menu in this program that has menu items"); 
     menuBar.add(menu); 

     // a group of JMenuItems 
     menuItem = new JMenuItem("import...", KeyEvent.VK_T); 
     // menuItem.setMnemonic(KeyEvent.VK_T); //used constructor instead 
     menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, 
       ActionEvent.ALT_MASK)); 
     menuItem.getAccessibleContext().setAccessibleDescription(
       "This doesn't really do anything"); 
     menuItem.addActionListener(this); 
     menu.add(menuItem); 

     menuItem = new JMenuItem("add file..."); 
     menuItem.setMnemonic(KeyEvent.VK_B); 
     menuItem.addActionListener(this); 
     menu.add(menuItem); 

     menuItem = new JMenuItem("open catalog"); 
     menuItem.setMnemonic(KeyEvent.VK_B); 
     menuItem.addActionListener(bl); 

     menu.add(menuItem); 

     menuItem = new JMenuItem("save catalog"); 
     menuItem.setMnemonic(KeyEvent.VK_B); 
     menuItem.addActionListener(b2l); 
     menu.add(menuItem); 

     // a group of radio button menu items 
     menu.addSeparator(); 

     // a submenu 
     menu.addSeparator(); 
     submenu = new JMenu("A submenu"); 
     submenu.setMnemonic(KeyEvent.VK_S); 

     menuItem = new JMenuItem("An item in the submenu"); 
     menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2, 
       ActionEvent.ALT_MASK)); 
     menuItem.addActionListener(this); 
     submenu.add(menuItem); 

     menuItem = new JMenuItem("Another item"); 
     menuItem.addActionListener(this); 
     submenu.add(menuItem); 
     menu.add(submenu); 

     // Build second menu in the menu bar. 
     menu = new JMenu("Edit"); 
     menu.setMnemonic(KeyEvent.VK_N); 
     menu.getAccessibleContext().setAccessibleDescription(
       "This menu does nothing"); 
     menuBar.add(menu); 

     return menuBar; 
    } 
... 
    private static void createAndShowGUI() { 
     // Create and set up the window. 
     JFrame frame = new JFrame("Media Cataloguer"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     MainInterface dm = new MainInterface(); 
     frame.setJMenuBar(dm.createMenuBar()); 
... 



    ... 
    //mutual ActionListener 
    class ButtonListener implements ActionListener { 
      public void actionPerformed(ActionEvent e) { 
         //loading of array with data 
       CatalogueLoader loader = new CatalogueLoader("test.ctlg"); 
       try { 
        Object[][] ctlgData = loader.readCtlg(); 

        for (int i = 0; i < loader.size; i++) { 

         for (int j = 0; j < 5; j++) { 

          table.setValueAt(ctlgData[i][j], i, j); 

         } 

        } 

       } catch (IOException ex) { 

       } 
      } 
     } 
    private ButtonListener bl = new ButtonListener(); 
+0

你需要向我們展示一點代碼,至少是ActionListener。 – 2012-01-31 14:22:56

+0

一個按鈕是一個按鈕,是一個按鈕。無論按鈕的位置如何,它都應該完美運行。 – fireshadow52 2012-01-31 15:28:06

+0

對不起,只是添加了一些代碼 – 2012-01-31 15:52:56

回答

0

你不加入同一偵聽到b1和菜單項。我從你的代碼複製了這個:

b1.addActionListener(bl); 
menuItem.addActionListener(this);