gpt4 book ai didi

java - 输出没有重定向到正确的 Jtextarea

转载 作者:行者123 更新时间:2023-11-29 04:52:04 26 4
gpt4 key购买 nike

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);

}

}

文本面板.java

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);
}


}

表单面板.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);

}

}

JumpHosts.java

    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
}
}
}
}

所以每当我点击任何按钮时,输出都会被重定向到一个文本区域,而其他文本区域似乎无法使用。即到最后创建的选项卡。我希望当我点击按钮 1 时,它应该写入选项卡 1,当我点击按钮 2 时,它应该写入选项卡 2,依此类推。

因为我是 java 的新手,所以感谢示例

最佳答案

在 JumpHosts 中:

TextPanel textPanel = new TextPanel();

您创建了 TextPanel 的实例,该实例未被程序中的其他对象引用。这不是您在 MainFrame 中创建的任何一个 TextPanel

需要传递在MainFrame中创建的TextPanel,即:

private TextPanel textPanel;
private TextPanel textPanel2;

进入您的 JumpHosts 构造函数:

JumpHosts(TextPanel textPanel1, TextPanel textPanel2)

能够像 MainFrame 那样引用相同的 TextPanel

对跟进的回应:您需要先将 TextPanelMainFrame 构造函数中传递给 FormPanel 构造函数。然后您需要修改您的 FormPanel 构造函数以将 TextPanel 传递给您的 JumpHosts 构造函数。

关于java - 输出没有重定向到正确的 Jtextarea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35087583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com