2012-09-03 14 views
1

目前我正在試圖讓自己的前端GDB。到目前爲止,除了一部分外,一切都是順其自然的;管道輸入到過程中,一旦它被打開。我有一個例子,從我下面的代碼:試圖使用JButton作爲InputStream

private JButton run = new JButton("Run"); 
    JToolBar vertical = new JToolBar(JToolBar.VERTICAL); 
    vertical.add(run); 
    add(vertical, BorderLayout.WEST); 

    run.addActionListener(new ActionListner() 
    { 
     public void actionPerformed(ActionEvent arg0) 
     { 
      Process proc; 
      proc = Runtime.getRuntime().exec("gdb"); 
      proc = Runtime.getRuntime().exec("r"); 
     } 
    } 

這將讓我運行命令「GDB」和管它的所有輸出到我的文本區,但在此之後,該進程關閉,我可以」再運行'r'等命令到相同的進程,而是打開另一個命令並嘗試自己執行命令'r';那麼我有沒有辦法在同一個過程中執行這些?另外,因爲這將是一個GUI,我需要讓多個按鈕能夠與同一個進程交互,即按鈕'Run'需要能夠執行'r',而按鈕'Breakpoint'需要執行'b'到相同的過程,這可能嗎?

TL; DR:需要通過GUI使用Java中的相同進程運行多個系統命令,有可能嗎?

回答

4
final PrintWriter out = new PrintWriter(proc.getOutputStream()); 
out.println("r"); 

它們不是獨立的進程,它們輸入到gdb。 :-)

+0

嗯...我將如何得到的輸出,並將其傳遞到我的JTextArea? – centip3de

+0

@ centip3de該進程的正常輸出已根據OP輸入到您的文本區域;這樣做不應該需要任何改變。 – oldrinb

+0

我試圖使用BufferedReaders輸出到我的TextArea,它到目前爲止與Runtime一起工作(pastebin.com/hSK27piR(無法讓我的代碼在commetns中正確格式化))。然而,當我添加你的代碼時,在執行我的Runtime()調用之後,我的BufferedReader和lines變量都是null – centip3de

0

你需要抽象你與GDB的交互。我會製作特殊的界面「DebugWithGDB」並聲明諸如啓動/停止/斷點等方法

你的情況你試圖將GDB與你的事件調用(actionPerformed)耦合在一起,而且產生兩個不同的進程。

我會在我的類中有一個變量,並且此變量將保存該接口的實現。所以所有的按鈕都會引用這個變量,並且能夠在其上調用命令。

也可以考慮以不凍結你的GUI使用http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingUtilities.html(它將把行動統一到主隊列線程你)

+1

你不想在美國東部時間工作,對;但使用'SwingUtilities'就行了。嘗試使用'Executor' :-) – oldrinb