2013-04-02 115 views
0

我目前有一個程序,在不同的行中在'System.out.println()'語句的屏幕上打印文本行。我是Java,Eclipse和WindowBuilder的新手。控制檯輸出到WindowBuilder GUI

我現在正在爲此程序添加一個GUI。我能夠使用按鈕創建GUI,這些按鈕正常工作。我的問題是,我想要將打印到eclipse控制檯(或命令行)的所有內容都打印到GUI中的文本框中,而不是實時打印。我怎樣才能輕鬆做到這一點?

package Onur; 


import java.awt.BorderLayout; 

public class BehaSendDFGUI extends JFrame { 

    private BehaviourSendWithDF1 myAgent; // Reference to the agent class 
    private JPanel contentPane; 
    private JDesktopPane desktopPane; 
    private JButton btnMessage; 
    private JButton btnMessage_1; 
    private JButton btnMessage_2; 
    private JButton btnMessage_3; 
    private JTextArea textArea = new JTextArea(); 

    public void setAgent(BehaviourSendWithDF1 a) { 
     myAgent = a; // provide the value of the reference of BehaviourSendWithDF1 class here 

    } 

    private void updateTextArea(final String text) { 
      SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       textArea.append(text); 
      } 
      }); 
     } 

     private void redirectSystemStreams() { 
      OutputStream out = new OutputStream() { 
      @Override 
      public void write(int b) throws IOException { 
       updateTextArea(String.valueOf((char) b)); 
      } 

      @Override 
      public void write(byte[] b, int off, int len) throws IOException { 
       updateTextArea(new String(b, off, len)); 
      } 

      @Override 
      public void write(byte[] b) throws IOException { 
       write(b, 0, b.length); 
      } 
      }; 

      System.setOut(new PrintStream(out, true)); 
      System.setErr(new PrintStream(out, true)); 
     } 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (Throwable e) { 
      e.printStackTrace(); 
     } 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        BehaSendDFGUI frame = new BehaSendDFGUI(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public BehaSendDFGUI() { 


     setTitle("Behaviour Sender"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 523, 398); 

     JMenuBar menuBar = new JMenuBar(); 
     setJMenuBar(menuBar); 

     JMenu mnFile = new JMenu("File"); 
     menuBar.add(mnFile); 

     JMenuItem mntmExit = new JMenuItem("Exit"); 
     mnFile.add(mntmExit); 

     JMenu mnAbout = new JMenu("About"); 
     menuBar.add(mnAbout); 

     JMenuItem mntmAboutThisGui = new JMenuItem("About This GUI"); 
     mnAbout.add(mntmAboutThisGui); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     JToolBar toolBar = new JToolBar(); 
     toolBar.setFloatable(false); 
     contentPane.add(toolBar, BorderLayout.CENTER); 

     desktopPane = new JDesktopPane(); 
     toolBar.add(desktopPane); 

     btnMessage = new JButton("Send Message 1"); 
     btnMessage.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       BehaviourSendWithDF1.STEP = "1"; 
       System.out.println("Button Pressed => STEP = " + BehaviourSendWithDF1.STEP); 
       myAgent.behaSend();    
      } 

     }); 
     btnMessage.setBounds(10, 11, 111, 23); 
     desktopPane.add(btnMessage); 

     btnMessage_1 = new JButton("Send Message 2"); 
     btnMessage_1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       BehaviourSendWithDF1.STEP = "2"; 
       System.out.println("Button Pressed => STEP = " + BehaviourSendWithDF1.STEP); 
       myAgent.behaSend(); 
      } 
     }); 
     btnMessage_1.setBounds(131, 11, 111, 23); 
     desktopPane.add(btnMessage_1); 

     btnMessage_2 = new JButton("Send Message 3"); 
     btnMessage_2.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       BehaviourSendWithDF1.STEP = "3"; 
       System.out.println("Button Pressed => STEP = " + BehaviourSendWithDF1.STEP); 
       myAgent.behaSend(); 
      } 
     }); 
     btnMessage_2.setBounds(252, 11, 111, 23); 
     desktopPane.add(btnMessage_2); 

     btnMessage_3 = new JButton("Send Message 4"); 
     btnMessage_3.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       BehaviourSendWithDF1.STEP = "4"; 
       System.out.println("Button Pressed => STEP = " + BehaviourSendWithDF1.STEP); 
       myAgent.behaSend(); 
      } 
     }); 
     btnMessage_3.setBounds(373, 11, 111, 23); 
     desktopPane.add(btnMessage_3); 

     JButton btnExitGui = new JButton("Exit GUI"); 
     btnExitGui.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       dispose(); 
      } 
     }); 
     btnExitGui.setBounds(189, 293, 130, 23); 
     desktopPane.add(btnExitGui); 

     JTextPane txtpnConsoleOutput = new JTextPane(); 
     txtpnConsoleOutput.setText("Console Output:"); 
     txtpnConsoleOutput.setBounds(10, 45, 101, 20); 
     desktopPane.add(txtpnConsoleOutput); 

     JScrollPane scrollPane = new JScrollPane(); 
     scrollPane.setBounds(10, 76, 475, 206); 
     desktopPane.add(scrollPane); 
     scrollPane.setViewportView(textArea); 

     redirectSystemStreams(); 

    } 
} 

我看到的NetBeans的這個解決方案,但不能申請它的WindowBuilder:提前

http://unserializableone.blogspot.com/2009/01/redirecting-systemout-and-systemerr-to.html

感謝。

編輯:該代碼的工作版本在問題中編輯。感謝所有的幫助。

+0

的解決方案,重定向的System.out和System.err * *是相同的,這有絕對無關的NetBeans或WindowsBuilder或任何其他Swing windows構建工具以及所有與Swing相關的工具。如果該解決方案對您無效,那麼您需要告訴我們更多信息,包括確切地說明或不能發揮作用的原因。 –

+0

我嘗試將代碼複製並粘貼到Eclipse中;但得到了很多我無法解決的錯誤。 –

+0

當然,你不能那樣做。不要盲目地複製和粘貼代碼,特別是你不明白的代碼。相反,要學習代碼試圖做什麼,並使用這些概念編寫自己的代碼。你的問題需要更多地關注你不瞭解的內容,否則這個問題不會對你有所幫助。 –

回答

1

你的問題包括

  1. 你試圖使用一個不存在,textPane一個變量,
  2. 你的程序不具有可以顯示文本的文本組件。我建議您至少添加一個JTextArea,以便您可以將輸出重定向到它。如果你願意,可以稱它爲textPane,但不管你怎麼稱呼它,你至少需要東西,它可以顯示多行文本。
  3. 同樣,您提供的鏈接中描述的一般技術是正確的 - 您需要將System.out和System.err重定向到創建的OutputStream,但您必須小心更新Swing組件僅在Swing事件線程中使用SwingUtilities.invokeLater(new Runnable() {...}) ...
  4. 因此正確使用該文章的建議工作。所以,請繼續。

再次,閱讀Swing教程並放下Windows builder代碼生成器。代碼生成器可以節省您的時間,但是如果您在對Swing庫有很好的理解之前使用它們,那麼在您最需要的時候就會遇到大問題,而不是最基本的GUI和行爲。

編輯
你似乎是試圖調用append(...)上一個JTextField,而這個類不允許該消息。我建議

  • 你大大簡化類,所以它只有最基本的GUI來演示的System.out的偏轉與犯錯,並
  • 再次使用一個JTextArea,不是一個JTextField。

編輯2
你問:

I couldn't solve the 'textArea.append(text);' scope error: textArea cannot be resolved.

記下你聲明 textarea的變量。由於它不是在類中聲明的,而是在方法或構造函數中聲明的,所以在課程的其他地方是不可見的。解決辦法是在課堂上宣佈,而不是在別處。

編輯3
例如,

import java.awt.event.ActionEvent; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.PrintStream; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class RedirectOut extends JPanel { 
    private static final int BUTTON_COUNT = 4; 
    private JTextArea textArea = new JTextArea(20, 20); 
    private SomeAgent myAgent; 

    public RedirectOut() { 
     redirectSystemStreams(); 

     setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 

     for (int i = 0; i < BUTTON_COUNT; i++) { 
     final int count = i + 1; 
     JButton button = new JButton(new AbstractAction("Send Message " + count){ 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       myAgent.setStep(String.valueOf(count)); 
       System.out.println("Button Pressed => STEP = " 
        + myAgent.getStep()); 
       myAgent.behaSend(); 
      } 
     }); 
     JPanel btnPanel = new JPanel(); 
     btnPanel.add(button); 
     add(btnPanel); 
     } 
     add(new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
      JScrollPane.HORIZONTAL_SCROLLBAR_NEVER)); 
    } 

    public void setAgent(SomeAgent agent) { 
     this.myAgent = agent; 
    } 

    public void updateTextArea(final String text) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      textArea.append(text); 
     } 
     }); 
    } 

    private void redirectSystemStreams() { 
     OutputStream out = new OutputStream() { 
     @Override 
     public void write(int b) throws IOException { 
      updateTextArea(String.valueOf((char) b)); 
     } 

     @Override 
     public void write(byte[] b, int off, int len) throws IOException { 
      updateTextArea(new String(b, off, len)); 
     } 

     @Override 
     public void write(byte[] b) throws IOException { 
      write(b, 0, b.length); 
     } 
     }; 

     System.setOut(new PrintStream(out, true)); 
     System.setErr(new PrintStream(out, true)); 
    } 

    private static void createAndShowGui() { 
     RedirectOut redirectOut = new RedirectOut(); 
     redirectOut.setAgent(new SomeAgent()); 

     JFrame frame = new JFrame("RedirectOut"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(redirectOut); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

我得到了1和2並修復。我不明白你的意思是數字4.我嘗試更正範圍錯誤,並在創建文本區域後在代碼中調用redirectSystemStreams()。沒有編譯錯誤,但是當我運行GUI並且不打印任何東西時,GUI會卡住。 –

+0

@OnurDogu:請參閱編輯 –

+0

另外爲什麼使用JDesktopPane? –