Erste Schritte bash-Befehl mit Swing ausführen

dany

Mitglied
Hallo,
Ich hab hier mein erstes kleines Java Programm erstellt,
wäre toll wenn mir jemand helfen könnte es zum laufen zu bringen.

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;

public class HelloWorldSwing extends JFrame implements ActionListener {
    
/* Definiert neuen Schalter*/
	private JButton button;
	private JLabel label;
    
    public HelloWorldSwing(){
        button = new JButton("Stop Apache");
        button.addActionListener(this);
        
        this.getContentPane().add(button);
    }
/*Schalter soll Befehl in der Konsole ausführen und ggf. die Shellausgabe einblenden. */  
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == button){
            try {
				Runtime.getRuntime().exec("/bin/bash -c /etc/init.d/apache2 stop");
			} catch (IOException e1) {
				String x=e1.printStackTrace();
				label = new JLabel(x);
			}
        }
    
    
    public static void main(String[] args){
        HelloWorldSwing bec = new HelloWorldSwing();
        bec.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        bec.setSize(200, 200);
        bec.setVisible(true);
    }
}

Ich hoffe dass es soweit selbsterklärend ist, falls ich aber irgenwelche wichtige Info vergessen haben sollte, bitte nicht gleich flamen, wie gesagt mein erstes Java Programm (und es könnten auch gravierende Fehler drin sein), aber wenn es erstmal läuft und ich es verstehe, hätte ich zumindest eine gute Basis um selbst zu experimentieren.

Gruss Dan
 
Wenns dein erstes Programm ist dann fang doch bitte nicht direkt mit Swing an 😉
(auch wenn der Code ganz gut ausschaut, bis auf das exceptionhandling mit dem label)

Das Thema mit dem shellaufruf kannst du doch wesentlich besser in ner einfachen konsolenanwendung testen. Da kannst du dir sicher sein dass sonst keine fehler sind.

Zu deinem Problem:
Verwende statt Runtime#exec lieber den ProcessBuilder. Außerdem kannst du dein Kommando nicht in einem String übergeben sondern musst die einzelnen Parameter in nem String[] Array trennen. Das Process Objekt dass du zurückbekommst solltest du dir merken und dessen input- und errorstream mindestens leeren, sonst kanns passieren dass das Programm auf das leeren der Streams wartet.
 
Außerdem kannst du dein Kommando nicht in einem String übergeben sondern musst die einzelnen Parameter in nem String[] Array trennen.

Ist mir so noch nie aufgefallen. hab in einem meiner Projekte rumgewühlt und das gefunden:

Java:
Runtime r = Runtime.getRuntime();
Process p = r.exec("./extProg/lzop.exe " + "./" + localpath + " -o " + destpath);

Funktioniert auch ohne String[] Array. Oder hab ich dich falsch verstanden?
 
...falls ich aber irgenwelche wichtige Info vergessen haben sollte...
Worin unterscheidet sich denn das tatsächliche Verhalten deines Programms von dem gewünschten Verhalten?

Ich habe es nicht ausprobiert, aber generell halte ich es für eine gute Idee im Constructor den Superconstructor aufzurufen. Weiterhin fällt auf, das du in Zeile 27 ständig neue JLabels erzeugst welche du dann nicht nutzt. Sinnvoller wäre es das Label einmalig im Constructor zu initialisieren und zum Frame hinzuzufügen (wie du es ja auch schon beim Button machst), und in Zeile 27 dann lediglich den Text des Labels zu verändern.
 
Gut, stell ich mir etwa so vor, (was natürlich nicht richtig ist)
Java:
            try {
            	public Process exec("/bin/bash -c /etc/init.d/apache2 stop")
                        throws IOException;
			} catch (IOException e) {
				String[] x=e.printStackTrace();
				label = new JLabel(x);
			}
        }
Und ja ich will gleich mit Swing anfangen, denn das Programm soll dazu dienen, um oft benutzte Befehle nicht mehr über die Konsole aufrufen zu müssen.
(ja, vielleicht bin ich etwas ungeduldig 🙂
 
@ Dow Jones. Wie mach ich das am Besten?

Ach so, Leute ich mag auch gerne grafische Oberflächen,

Und eigentlich will ich mir so das Programmieren erleichtern....
z.B. : ein sudo kate (per Button+dateiauswahl(mit Vorauswahl)) wäre toll, ich kann mir halt nicht immer merken welche Datei in welchem Verzeichnis liegt... (ja da kann man sicher ewig drüber diskutieren...))
 
Zuletzt bearbeitet:
Das geht ziemlich genau so wie ich es beschrieben hatte. 🙂

Java:
    public HelloWorldSwing(){
        super();  // aufruf des Constructors von JFrame

        button = new JButton("Stop Apache");
        button.addActionListener(this);
        
        label = new JLabel();
        
        this.getContentPane().add(button);
        this.getContentPane().add(label);
    }

und Zeile 27 müsste man abändern in
Java:
        label.setText(x);
(wobei x ein String sein sollte, und kein Array von Strings. Für mehrzeiligen Text bietet sich statt eines JLabels eher eine JTextArea oder sowas an)
 
Zuletzt bearbeitet von einem Moderator:
Gut, mit
Code:
            Process proc=Runtime.getRuntime().exec("kdesudo kate /etc/apache2/apache2.conf");
hab ich es nun hinbekommen.

Jetzt wollte ich es mit dem Processbuilder probieren,
Ich nun einfach den Code ersetz aber es funktioniert nicht, (auf der Konsole aber erfolgreich getestet)
Ausgabe sagt "Unhandled IOException"

Java:
public class bash extends JFrame
{
	static JLabel lbText = new JLabel("Apache",0);
	static JButton btOK = new JButton("Start");
	static JButton btEdit = new JButton("Edit");
	JPanel plButtons = new JPanel();

	bash()
	{
		super("Start Cebter");
		plButtons.setLayout(new GridLayout(0,8));
		plButtons.add(btOK);
		plButtons.add(btEdit);
		getContentPane().setLayout( new BorderLayout() );
		getContentPane().add("North", lbText );
		getContentPane().add("South", plButtons );
		setSize(10,20);
		pack();
		setVisible(true);
	}
	
	public static void main ( String[] argv) throws IOException, InterruptedException
	{
		new bash();
        //Add action listener to button
        btOK.addActionListener(new ActionListener() {
 
            public void actionPerformed(ActionEvent e)
            {
                //Execute when button is pressed
                System.out.println("opening kate");
                

                try
                {
                Process proc=Runtime.getRuntime().exec("kdesudo kate /etc/apache2/apache2.conf");
                BufferedReader read=new BufferedReader(new InputStreamReader(proc.getInputStream()));

                while(read.ready())
                {
                System.out.println(read.readLine());
                }
                }
                catch(IOException ex)
                {
                System.out.println(ex.getMessage());
                }
            }
        });
     
        btEdit.addActionListener(new ActionListener() 
        {
        	 
            public void actionPerformed(ActionEvent ae)
            {
                //Execute when button is pressed
                System.out.println("Apache2 stopped");
                
                String[] command = {"bash", "-c", "ls"};
                ProcessBuilder probuilder = new ProcessBuilder( command );

                //You can set up your work directory
                probuilder.directory(new File("/home/eclipse3.7/workspace/"));
                
                Process process = probuilder.start();
                
                //Read out dir output
                InputStream is = process.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line;
                System.out.printf("Output of running %s is:\n",
                        Arrays.toString(command));
                while ((line = br.readLine()) != null) {
                    System.out.println(line);
                }
                
                //Wait to get exit value
                	try 
                	{
                    int exitValue = process.waitFor();
                    System.out.println("\n\nExit Value is " + exitValue);
                	}
                    catch(IOException ie)
                	{
                		System.out.println(ie.getMessage());
                	}
                	catch (InterruptedException e) 
                	{
                		e.printStackTrace();
                	}
            };
        });
}};

Dabei ist doch eine dabei ,oder hab ich da einen Denk bzw. Logikfehler?

Anm: Ach wo ich gerade dabei bin, wie kann ich mir die Fehlerausgabe per label anzeigen lassen?
Ich dachte statt
Code:
System.out.println(ie.getMessage());
einfach
Code:
lbText.setText(ie.getMessage());
aber geht ja nicht?
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben