Java 输出未重定向到正确的Jtextarea

Java 输出未重定向到正确的Jtextarea,java,swing,jsch,Java,Swing,Jsch,TextPanel.java MainFrame.java import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.Event; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java

TextPanel.java

MainFrame.java

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;


public class MainFrame extends JFrame{

    private TextPanel textPanel1;
    private TextPanel textPanel2;
    private FormPanel formPanel;
    private JSplitPane splitPane;
    private JTabbedPane tabPane;

    public MainFrame() {

        super("Hello");

        setLayout(new BorderLayout());
        tabPane = new JTabbedPane();        

        textPanel1 = new TextPanel();
        tabPane.addTab("Tab 1", textPanel1);

        textPanel2 = new TextPanel();
        tabPane.addTab("Tab 2", textPanel2);

        //Newly Added code
        formPanel = new FormPanel(textPanel1,textPanel2);

        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,formPanel,tabPane);

        splitPane.setOneTouchExpandable(true);

        add(splitPane,BorderLayout.CENTER);
//      add(formPanel,BorderLayout.WEST);


        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setMinimumSize(new Dimension(500, 400));
        setSize(600, 500);

    }

}
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Scrollbar;
import java.io.ByteArrayOutputStream;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;


public class TextPanel extends JPanel {

    private JTextArea textArea1;
    private JTextArea textArea2;
    private FormPanel formPanel;
    //Newly added code 
    private TextPanel textPanel;
    public TextPanel(){

        setLayout(new BorderLayout());

        textArea1 = new JTextArea();
        add(new JScrollPane(textArea1),BorderLayout.CENTER);

        //textArea2 = new JTextArea();
        //add(new JScrollPane(textArea2),BorderLayout.CENTER);


    }
    //Newly added code      
        public void appendText(String string, TextPanel textPanel2) {
    // TODO Auto-generated method stub
    this.textPanel = textPanel2;                                                                                                                                                                                                                                                                                                                                                
    textArea1.append(string);   
}


}
FormPanel.java

MainFrame.java

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;


public class MainFrame extends JFrame{

    private TextPanel textPanel1;
    private TextPanel textPanel2;
    private FormPanel formPanel;
    private JSplitPane splitPane;
    private JTabbedPane tabPane;

    public MainFrame() {

        super("Hello");

        setLayout(new BorderLayout());
        tabPane = new JTabbedPane();        

        textPanel1 = new TextPanel();
        tabPane.addTab("Tab 1", textPanel1);

        textPanel2 = new TextPanel();
        tabPane.addTab("Tab 2", textPanel2);

        //Newly Added code
        formPanel = new FormPanel(textPanel1,textPanel2);

        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,formPanel,tabPane);

        splitPane.setOneTouchExpandable(true);

        add(splitPane,BorderLayout.CENTER);
//      add(formPanel,BorderLayout.WEST);


        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setMinimumSize(new Dimension(500, 400));
        setSize(600, 500);

    }

}
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Scrollbar;
import java.io.ByteArrayOutputStream;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;


public class TextPanel extends JPanel {

    private JTextArea textArea1;
    private JTextArea textArea2;
    private FormPanel formPanel;
    //Newly added code 
    private TextPanel textPanel;
    public TextPanel(){

        setLayout(new BorderLayout());

        textArea1 = new JTextArea();
        add(new JScrollPane(textArea1),BorderLayout.CENTER);

        //textArea2 = new JTextArea();
        //add(new JScrollPane(textArea2),BorderLayout.CENTER);


    }
    //Newly added code      
        public void appendText(String string, TextPanel textPanel2) {
    // TODO Auto-generated method stub
    this.textPanel = textPanel2;                                                                                                                                                                                                                                                                                                                                                
    textArea1.append(string);   
}


}
JumpHosts.java

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.ObjectInputStream.GetField;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.border.Border;


public class FormPanel extends JPanel {

    private static int numberOfTabs = 1;
    private JLabel serverName_1;
    private JLabel serverName_2;
    private JButton startServer_1;
    private JButton startServer_2;
    //Added New Code
    private TextPanel textPanel1;
    private TextPanel textPanel2; 
    JumpHosts jumpHosts = new JumpHosts();

    //Added New Code
    public FormPanel(final TextPanel textPanel1,final TextPanel textPanel2){

        Dimension dim  = getPreferredSize();
        dim.width = 350;
        setPreferredSize(dim);
        setMinimumSize(dim);


        //Added New Code
        this.textPanel = textPanel1;
        this.textPanel = textPanel2;

        serverName_1 = new JLabel("server1 ");
        startServer_1 = new JButton("Start");

        serverName_2 = new JLabel("server2 ");
        startServer_2 = new JButton("Start");


        startServer_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                String[] ev = new String[]{"username@10.10.10.10","username@server1"};
                String cmd = "ls -ltr";
                //jumpHosts.JumpHosts(ev,cmd);
                //Newly added code
                jumpHosts.JumpHosts(ev,cmd,textPanel1);

            }
        });

        startServer_2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                String[] ev = new String[]{"username@10.10.10.10","username@server2"};
                String cmd = "ls -ltr";
                //jumpHosts.JumpHosts(ev,cmd);
                //Newly added code
                jumpHosts.JumpHosts(ev,cmd,textPanel2);

            }
        });

        Border innerborder = BorderFactory.createTitledBorder("Detail");
        Border outerborder = BorderFactory.createEmptyBorder(5, 5, 5, 5);

        setBorder(BorderFactory.createCompoundBorder(outerborder, innerborder));

        layoutComponents();
    }

    public void layoutComponents(){

        setLayout(new GridBagLayout());

        GridBagConstraints gc = new GridBagConstraints();


        //////////// First row ////////////
        gc.gridy = 0;

        gc.weightx = 1;
        gc.weighty = 0.01;

        gc.gridx = 0;
        gc.insets = new Insets(0, 0, 0, 5);
        gc.anchor = GridBagConstraints.FIRST_LINE_START;
        add(serverName_1,gc);

        /////////// Next Column ////////////
        gc.gridy = 0;

        gc.weightx = 2;
        gc.weighty = 0.01;

        gc.gridx = 2;
        gc.insets = new Insets(0, 0, 0, 5);
        gc.anchor = GridBagConstraints.FIRST_LINE_START;
        add(startServer_1,gc);

        //////////// Second row ////////////
        gc.gridy++;

        gc.weightx = 1;
        gc.weighty = 0.1;

        gc.gridx = 0;
        gc.insets = new Insets(0, 0, 0, 5);
        gc.anchor = GridBagConstraints.FIRST_LINE_START;
        add(serverName_2,gc);

        /////////// Next Column ////////////
        //gc.gridy = 1;

        gc.weightx = 2;
        gc.weighty = 0.1;

        gc.gridx = 2;
        gc.insets = new Insets(0, 0, 0, 5);
        gc.anchor = GridBagConstraints.FIRST_LINE_START;
        add(startServer_2,gc);

    }

}
import com.jcraft.jsch.*;
导入java.awt.*;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.OutputStream;
导入javax.swing.*;
公共类JumpHosts{
TextPanel TextPanel=新建TextPanel();
//新增代码
public void JumpHosts(最终字符串[]arg、最终字符串命令、最终文本面板TextPanel){
StringBuffer resultDisplayBuffer=新的StringBuffer();
SwingWorker sw=新SwingWorker(){
@凌驾
受保护对象doInBackground()引发异常{
试一试{
JSch JSch=新的JSch();
如果(arg.length 0){
inti=in.read(tmp,0,1024);
if(i<0)
打破
appendText(新字符串(tmp,0,i));
}
if(channel.isClosed()){
textPanel.appendText(新字符串(“退出状态:+channel.getExitStatus())+“\n”);
打破
}
试一试{
睡眠(1000);
}捕获(异常ee){
系统输出打印(ee);
}
}
通道断开();
textPanel.appendText(“断开连接\n\n”);
对于(int i=sessions.length-1;i>=0;i--){
会话[i]。断开连接();
}
}
捕获(例外e){
系统输出打印ln(e);
}
返回null;
}
公众假期结束(){
试一试{
System.out.println(get());
}捕获(例外情况除外){
例如printStackTrace();
}
}
};
sw.execute();
}
公共静态类MyUserInfo实现UserInfo,UIKeyboardInteractive{
公共字符串getPassword(){return passwd;}
公共布尔promptYesNo(字符串str){
对象[]选项={“是”、“否”};
int foo=JOptionPane.showOptionDialog(null,
str,
“警告”,
JOptionPane.DEFAULT_选项,
JOptionPane.WARNING_消息,
null,选项,选项[0]);
返回foo==0;
}
字符串密码;
JTextField passwordField=(JTextField)新的JPasswordField(20);
公共字符串getPassphrase(){return null;}
公共布尔提示密码短语(字符串消息){return true;}
公共布尔提示密码(字符串消息){
对象[]ob={passwordField};
整数结果=
JOptionPane.showConfirmDialog(null、ob、message、,
JOptionPane.OK\u CANCEL\u选项);
if(result==JOptionPane.OK\u选项){
passwd=passwordField.getText();
返回true;
}
else{return false;}
}
公共void showMessage(字符串消息){
showMessageDialog(空,消息);
}
最终GRIDBAG约束gbc=
新的网格约束(0,0,1,1,1,1,
格林巴奇,西北,
gridbag.NONE,
新插图(0,0,0,0),0,0);
私人货柜小组;
公共字符串[]promptKeyboardInteractive(字符串目标,
字符串名,
字符串指令,
字符串[]提示符,
布尔值[]回声){
panel=新的JPanel();
panel.setLayout(新的GridBagLayout());
gbc.weightx=1.0;
gbc.gridwidth=GridBagConstraints.rements;
gbc.gridx=0;
面板添加(新JLabel(说明),gbc);
gbc.gridy++;
gbc.gridwidth=GridBagConstraints.RELATIVE;
JTextField[]text=新的JTextField[prompt.length];
对于跳线主机中的(int i=0;i)

TextPanel TextPanel=newtextpanel();

您创建程序中没有其他对象引用的
TextPanel
实例。这不是您在
MainFrame
中创建的
TextPanel
实例

您需要传递在大型机中创建的
文本面板
,即:

    import com.jcraft.jsch.*;
    import java.awt.*;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;

    import javax.swing.*;

    public class JumpHosts {

        TextPanel textPanel = new TextPanel();

//Newly added code
public void JumpHosts(final String[] arg,final String command,final TextPanel textPanel) {

        StringBuffer resultDisplayBuffer = new StringBuffer();

        SwingWorker sw = new SwingWorker(){

                @Override
                protected Object doInBackground() throws Exception {
                    try{
                          JSch jsch = new JSch();

                          if(arg.length <= 1){
                            System.out.println("This program expects more arguments.");
                            System.exit(-1);
                          }

                          Session session = null;
                          Session[] sessions = new Session[arg.length];

                          String host = arg[0];
                          String user = host.substring(0, host.indexOf('@'));
                          host = host.substring(host.indexOf('@')+1);

                          sessions[0] = session = jsch.getSession(user, host, 22);
                          session.setUserInfo(new MyUserInfo());
                          session.connect();
                          //textPanel.appendText("The session has been established to "+user+"@"+host+"\n");






//Newly added code     
    textPanel.appendText("The session has been established to "+user+"@"+host+"\n",textPanel);


                          for(int i = 1; i < arg.length; i++){
                            host = arg[i];
                            user = host.substring(0, host.indexOf('@'));
                            host = host.substring(host.indexOf('@')+1);

                            int assinged_port = session.setPortForwardingL(0, host, 22);
                            textPanel.appendText("portforwarding: "+
                                            "localhost:"+assinged_port+" -> "+host+":"+22+"\n");
                            sessions[i] = session =
                              jsch.getSession(user, "localhost", assinged_port);

                            session.setUserInfo(new MyUserInfo());
                            session.setHostKeyAlias(host);
                            session.connect();
                            textPanel.appendText("The session has been established to "+
                                            user+"@"+host+"\n");
                          }


                            String sudo_pass;
                            {
                            JTextField passwordField=(JTextField)new JPasswordField(8);
                            Object[] ob={passwordField}; 
                            int result=
                            JOptionPane.showConfirmDialog(null, 
                                 ob,
                                 "Enter password for sudo",
                                 JOptionPane.OK_CANCEL_OPTION);
                            if(result!=JOptionPane.OK_OPTION){
                            System.exit(-1);
                            }  
                            sudo_pass=passwordField.getText();
                            }

                            Channel channel=session.openChannel("exec");

                            // man sudo
                            //   -S  The -S (stdin) option causes sudo to read the password from the
                            //       standard input instead of the terminal device.
                            //   -p  The -p (prompt) option allows you to override the default
                            //       password prompt and use a custom one.
                            ((ChannelExec)channel).setCommand("sudo -S -p '' "+command);

                            InputStream in = channel.getInputStream();
                            OutputStream out = channel.getOutputStream();
                            ((ChannelExec) channel).setErrStream(System.err);

                            channel.connect();
                            out.write((sudo_pass + "\n").getBytes());
                            out.flush();


                            byte[] tmp = new byte[1024];
                            while (true) {
                                while (in.available() > 0) {
                                    int i = in.read(tmp, 0, 1024);
                                    if (i < 0)
                                        break;
                                    textPanel.appendText(new String(tmp,0,i));    
                                }
                                if (channel.isClosed()) {

                                    textPanel.appendText(new String("exit-status: " + channel.getExitStatus())+ "\n");       
                                    break;
                                }
                                try {
                                    Thread.sleep(1000);
                                } catch (Exception ee) {
                                    System.out.println(ee);
                                }
                            }
                            channel.disconnect();
                            textPanel.appendText("Disconnect\n\n");


                         for(int i = sessions.length-1; i >= 0; i--){
                            sessions[i].disconnect();
                          }
                        }


                        catch(Exception e){
                          System.out.println(e);
                        }
                    return null;
                }

                public void done(){
                    try {
                        System.out.println(get());
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
        };
         sw.execute();
    }


      public static class MyUserInfo implements UserInfo, UIKeyboardInteractive{
        public String getPassword(){ return passwd; }
        public boolean promptYesNo(String str){
          Object[] options={ "yes", "no" };
          int foo=JOptionPane.showOptionDialog(null, 
                 str,
                 "Warning", 
                 JOptionPane.DEFAULT_OPTION, 
                 JOptionPane.WARNING_MESSAGE,
                 null, options, options[0]);
           return foo==0;
        }

        String passwd;
        JTextField passwordField=(JTextField)new JPasswordField(20);

        public String getPassphrase(){ return null; }
        public boolean promptPassphrase(String message){ return true; }
        public boolean promptPassword(String message){
          Object[] ob={passwordField}; 
          int result=
          JOptionPane.showConfirmDialog(null, ob, message,
                        JOptionPane.OK_CANCEL_OPTION);
          if(result==JOptionPane.OK_OPTION){
        passwd=passwordField.getText();
        return true;
          }
          else{ return false; }
        }
        public void showMessage(String message){
          JOptionPane.showMessageDialog(null, message);
        }
        final GridBagConstraints gbc = 
          new GridBagConstraints(0,0,1,1,1,1,
                                 GridBagConstraints.NORTHWEST,
                                 GridBagConstraints.NONE,
                                 new Insets(0,0,0,0),0,0);
        private Container panel;
        public String[] promptKeyboardInteractive(String destination,
                                                  String name,
                                                  String instruction,
                                                  String[] prompt,
                                                  boolean[] echo){
          panel = new JPanel();
          panel.setLayout(new GridBagLayout());

          gbc.weightx = 1.0;
          gbc.gridwidth = GridBagConstraints.REMAINDER;
          gbc.gridx = 0;
          panel.add(new JLabel(instruction), gbc);
          gbc.gridy++;

          gbc.gridwidth = GridBagConstraints.RELATIVE;

          JTextField[] texts=new JTextField[prompt.length];
          for(int i=0; i<prompt.length; i++){
            gbc.fill = GridBagConstraints.NONE;
            gbc.gridx = 0;
            gbc.weightx = 1;
            panel.add(new JLabel(prompt[i]),gbc);

            gbc.gridx = 1;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.weighty = 1;
            if(echo[i]){
              texts[i]=new JTextField(20);
            }
            else{
              texts[i]=new JPasswordField(20);
            }
            panel.add(texts[i], gbc);
            gbc.gridy++;
          }

          if(JOptionPane.showConfirmDialog(null, panel, 
                                           destination+": "+name,
                                           JOptionPane.OK_CANCEL_OPTION,
                                           JOptionPane.QUESTION_MESSAGE)
             ==JOptionPane.OK_OPTION){
            String[] response=new String[prompt.length];
            for(int i=0; i<prompt.length; i++){
              response[i]=texts[i].getText();
            }
        return response;
          }
          else{
            return null;  // cancel
          }
        }
      }
    }
进入您的
JumpHosts
构造函数:

JumpHosts(TextPanel TextPanel 1,TextPanel TextPanel 2)

能够引用与大型机相同的
文本面板

对后续行动的答复:
您需要首先将
TextPanel
传递给
FormPanel
构造函数,从
MainFrame
构造函数开始。然后,您需要修改
FormPanel
构造函数,将
TextPanel
传递给
JumpHosts
构造函数。

删除所有出现的
static>一词
从您的TextPanel类。而不是
TextPanel.appendText
,在TextPanel的特定实例上调用该方法。@VGR我已将all设置为非静态并更新了代码。请参考更新的代码。但现在我在文本区域中根本看不到任何输出。我在代码中没有看到对
appendText
的任何调用(除了附近的隔离代码行)