2011-04-14 159 views
0

我製作了一個程序來監視聯網地方的活動機器,並將IP地址完美地顯示給JList(jList1)。當我點擊列表中的IP地址之一,然後右擊鼠標,JPopupMenu將出現一個菜單「關機」。當我試圖從彈出菜單中點擊「關機」菜單中有顯示一個錯誤,說:遠程桌面關機

Apr 14, 2011 1:57:07 PM UsernamePasswordPackage.NetCafeTime$9 actionPerformed SEVERE: null java.lang.RuntimeException: Unsupported operating system. 
     at UsernamePasswordPackage.NetCafeTime.shutdown(NetCafeTime.java:359) 
     at UsernamePasswordPackage.NetCafeTime$9.actionPerformed(NetCafeTime.java:444) 
     at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) 
     at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) 
     at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 
     at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) 
     at javax.swing.AbstractButton.doClick(AbstractButton.java:357) 
     at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:809) 
     at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:850) 
     at java.awt.Component.processMouseEvent(Component.java:6267) 
     at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) 
     at java.awt.Component.processEvent(Component.java:6032) 
     at java.awt.Container.processEvent(Container.java:2041) 
     at java.awt.Component.dispatchEventImpl(Component.java:4630) 
     at java.awt.Container.dispatchEventImpl(Container.java:2099) 
     at java.awt.Component.dispatchEvent(Component.java:4460) 
     at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) 
     at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) 
     at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) 
     at java.awt.Container.dispatchEventImpl(Container.java:2085) 
     at java.awt.Window.dispatchEventImpl(Window.java:2478) 
     at java.awt.Component.dispatchEvent(Component.java:4460) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
     at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

代碼我用來顯示彈出式菜單:

public void showProjectMenu(MouseEvent e){ 
    JPopupMenu menu = new JPopupMenu(); 
    JMenuItem menuItem; 
    menuItem = new JMenuItem("Shutdown"); 
    menuItem.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent ev){ 
      //JOptionPane.showMessageDialog(null, "newline"); 
      try { 
       shutdown(); 
      } catch (RuntimeException ex) { 
       Logger.getLogger(NetCafeTime.class.getName()).log(Level.SEVERE, null, ex); 
      } catch (IOException ex) { 
       Logger.getLogger(NetCafeTime.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    }); 
    menu.add(menuItem); 
    menu.show(e.getComponent(),e.getX(),e.getY()); 
} 

鼠標點擊事件代碼:

private void jList1MousePressed(java.awt.event.MouseEvent evt) { 
    if(SwingUtilities.isRightMouseButton(evt)&&!jList1.isSelectionEmpty()&&jList1.locationToIndex(evt.getPoint())==jList1.getSelectedIndex()){ 
      showProjectMenu(evt); 
     } 
    } 

    private void jList1MouseReleased(java.awt.event.MouseEvent evt) { 
    if(SwingUtilities.isRightMouseButton(evt)&&!jList1.isSelectionEmpty()&&jList1.locationToIndex(evt.getPoint())==jList1.getSelectedIndex()){ 
      showProjectMenu(evt); 
     } 
    } 

代碼我用來顯示彈出式菜單:

public void showProjectMenu(MouseEvent e){ 
    JPopupMenu menu = new JPopupMenu(); 
    JMenuItem menuItem; 
    menuItem = new JMenuItem("Shutdown"); 
    menuItem.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent ev){ 
      //JOptionPane.showMessageDialog(null, "newline"); 
      try { 
       shutdown(); 
      } catch (RuntimeException ex) { 
       Logger.getLogger(NetCafeTime.class.getName()).log(Level.SEVERE, null, ex); 
      } catch (IOException ex) { 
       Logger.getLogger(NetCafeTime.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    }); 
    menu.add(menuItem); 
    menu.show(e.getComponent(),e.getX(),e.getY()); 
} 

代碼我用於關閉另一臺電腦通過它的IP地址:

public void shutdown()throws RuntimeException, IOException{ 
    String shutdownCommand; 
    String operatingSystem = System.getProperty("os.name"); 
    if("Linux".equals(operatingSystem)||"Mac OS X".equals(operatingSystem)){ 
     shutdownCommand = "shutdown -h now"; 
    }else if("windows".equals(operatingSystem)){ 
     shutdownCommand = "shutdown.exe -s -t 0"; 
    }else{ 
     throw new RuntimeException("Unsupported operating system."); 
    } 
    Runtime.getRuntime().exec(shutdownCommand); 
} 

問題是,我不能去關閉其他電腦...

任何形式的幫助將不勝感激和感謝。 ..

+0

您應該改進您的比較操作系統名稱的方法。要包含任何版本的Windows操作系統,您應該測試:'System.getProperty(「os.name」)。toLowerCase()。contains(「windows」)' – eee 2011-04-14 06:49:06

+0

謝謝先生,我做了改進。我現在的問題是如何連接到其他IP地址,以便我可以建立連接,然後能夠關閉它。謝謝。 – 2011-04-14 07:44:45

+0

對於Windows操作系統,您的關機命令缺少一些信息。完整的在線文檔請參考'shutdown /?'。但是,這個命令需要更高的權限。您的Java應用程序應該以管理員模式運行,以使其正常工作。 – eee 2011-04-14 14:13:02

回答

2

錯誤說:"Unsupported operating system"並且在您的關機方法中,這是RuntimeException的消息,如果當前操作系統爲「Linux」,「Max OS X」或「windows」,則會引發此消息。那麼你是否檢查System.getProperty("os.name")實際返回?

編輯:重新讀你的問題後,我想你想關閉選定的IP地址的機器。因此,在您的關機方式中,我認爲您必須首先連接到該機器並在那裏執行shutdown命令。這意味着您需要在每臺要遠程關機的機器上運行服務器程序。無論是寫自己的一個或每個安裝SSH服務器,並連接到使用JSch

2

我建議你多檢查this example。隨着機器,因爲我明白這String operatingSystem = System.getProperty("os.name");代碼返回的Windows 2000在這個例子中。

check this too