2013-10-03 2 views
0

Я добавил actionlistener в jmenuitem, который вызывает класс, который читает файл excel и открывает jgraph в jframe. Я также добавил еще один actionlistener в другой jmenuitem, чтобы вызвать тот же класс для одного и того же файла exel, но другой лист excel (другой параметр int). Однако, когда я запускаю свой основной фрейм, и я нажимаю на пункты меню, я могу открыть только один из них за раз. И я должен закрыть ее, чтобы открыть другую. Мне нужно изменить его так, чтобы всякий раз, когда пользователь нажимает onit, каждый раз появляется новый другой кадр/окно.Каждый раз, когда запускается класс, он открывает новый фрейм

public class ReadExcel { 

//reads excel file sheet and saves some strings in arrays 
public static ArrayList<String> RM = new ArrayList<String>() ; 
... 




public static void excel(String excelfile, Integer sheetno) { 
... 
} 
} 

public class graphgen extends JFrame { 

//creates a graph based on ReadExcel arrays 


public graphgen() { 

     gen(); 

    } 

    public void gen(){ 

    } 

public static void main(String[] args) 
    { 


     graphgen frame = new graphgen(); 
     p2.add(graphComponent, BorderLayout.CENTER); 
     frame.setLayout(new BorderLayout()); 
     frame.add(p2, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setResizable(true); 
     frame.setSize(1600, 1200); 
     frame.setVisible(true); 


    } 

} 

Основной класс, который имеет строку меню:

menuItem = new JMenuItem("MenuItem1",KeyEvent.VK_B); 
    menuItem.addActionListener(new ActionListener() { 
          public void actionPerformed(ActionEvent event2) { 

            new ReadExcel(); 
           ReadExcel.excel(".xls", 0); 
            new graphgen(); 
            graphgen.main(null); 
           } 
          });  
         subsubmenu1.add(menuItem); 


    menuItem = new JMenuItem("MenuItem2",KeyEvent.VK_C); 
    menuItem.addActionListener(new ActionListener() { 
          public void actionPerformed(ActionEvent event2) { 

            new ReadExcel(); 
            ReadExcel.excel(".xls", 1); 
            new graphgen(); 
            graphgen.main(null); 
           } 
          });  
         subsubmenu1.add(menuItem); 

public static void main(String[] args) 
      { 


       GUIquery frame = new GUIquery(); 
       p.add(graphComponent, BorderLayout.CENTER); 
       frame.setLayout(new BorderLayout()); 
       frame.add(p, BorderLayout.CENTER); 
       frame.setJMenuBar(GUIquery.createMenuBar()); 
       frame.pack(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setResizable(true); 
       frame.setSize(1600, 1200); 
       frame.setVisible(true); 


      } 

Ошибка:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: multiple points 
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source) 
    at java.lang.Double.parseDouble(Unknown Source) 
    at graphgen.gen(graphgen.java:645) 
    at graphgen.<init>(graphgen.java:62) 
    at GUIquery$9.actionPerformed(GUIquery.java:713) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.AbstractButton.doClick(Unknown Source) 
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source) 
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$200(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
+0

пожалуйста, напишите 'graphgen ', поскольку именно здесь может возникнуть ваша проблема – vandale

+0

' 'new ReadExcel(); ReadExcel.excel (". Xls", 0); новый graphgen(); graphgen.main (null); '' Это выглядит странно! Зачем создавать экземпляры этих классов при вызове статических методов? – qqilihq

+0

также как связаны «ReadExcel» и «graphgen»? больше кода пожалуйста – vandale

ответ

0

(. Немного угадывания участие)

Вы выполняете всю работу в методах actionPerformed, которые вызываются потоком диспетчера событий; это поток, который отвечает за обработку событий и рисование пользовательского интерфейса. Таким образом, пока вы работаете над таким методом, никакое другое событие (например, кнопка или щелчок меню) не может быть обработано.

Чтобы этого вам нужно поставить работу в отдельный Thread, например ..

public void actionPerformed(ActionEvent event2) { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      new ReadExcel(); 
      ReadExcel.excel(".xls", 0); 
      new graphgen(); 
      graphgen.main(null); 
     } 
    }).start(); 
} 

Если это открывает новое окно зависит от кода в graphgen. Если этот код открывает новое окно для каждого вызова статического метода main, и если код правильно обрабатывает потоки Swing, он будет делать это, но мы не сможем заглянуть в этот код.

Вызов другого кода Java при вызове статического метода main всегда является подозрительным. У вас должен быть открытый, документированный API, который вы могли бы использовать.

+0

Нет, это не позволит мне запускать их одновременно и открывать их в разных кадрах. Я получаю следующие ошибки: Исключение в потоке «Thread-4» java.lang.NumberFormatException: несколько точек \t at sun.misc.FloatingDecimal.readJavaFormatString (Unknown Source) \t на java.lang.Double.parseDouble (Unknown Source) \t в graphgen.gen (graphgen.java:645) \t в graphgen. (graphgen.java:62) \t в GUIquery $ 9 $ 1.Run (GUIquery.java:737) \t в java.lang.Thread.run (Unknown Source) @his – user2598911

+0

читать и понимать исключение: двойное значение не может быть проанализирован. – qqilihq

+0

Именно эта строка, но я не понимаю, почему должна быть проблема init. double value = Double.parseDouble (ReadExcel.totalarray); – user2598911

0

за ошибку вы показали, что она есть, потому что в какой-то момент вашего кода (at graphgen.gen(graphgen.java:645)) вы разбираете String и конвертируете его в двойное. Однако строка недействительна double - потому что она имеет несколько десятичных точек (.), Так как она выдает ошибку. Вы должны распечатать (через System.out.println()), что бы вы ни пытались преобразовать и проанализировать, что не так со строкой.

не

Я рекомендую вам взять все исходный код, почтовый индекс его и использовать услугу файлообмена, такие как Dropbox или Google Drive и разместить ссылку в качестве кода, имеющего отношение к ошибке нет здесь

Смежные вопросы