2012-01-31 3 views
0

자바에서 Swing을 사용하는 응용 프로그램을 작성 중이며 파일의 데이터를 디스패치하는 데 JTable을 사용합니다. JTable에 새로운 데이터를 추가하는 과정을 처리하기 위해 ActionListener를 만들었습니다. 내 애플 리케이션에서 JButton이 ActionListener를 사용하고 완벽하게 작동합니다. 하지만 JMenuBar에서 동일한 ActionListener를 버튼에 연결하면 무언가가 작동하지 않습니다. 몇 가지 조치가 있습니다 - 앱은 파일에서 데이터를로드하지만 JTable은 전혀 변경하지 않습니다. 그것은 무엇 일 수 있는가? 코드 : 당신은 B1과는 menuItem에 동일한 수신기를 추가하지 않을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를 표시해야합니다. –

+0

버튼은 버튼입니다 버튼입니다. 버튼의 위치와 관계없이 완벽하게 작동해야합니다. – fireshadow52

+0

죄송합니다. 일부 코드 –

답변

0

. 귀하의 코드에서 복사했습니다 :

b1.addActionListener(bl); 
menuItem.addActionListener(this); 
관련 문제