Innerhalb eines Fensters ein neues erschaffen

Shadoka

Mitglied
Hi,

gleich vorneweg: Ich bin hier neu und hoffe, dass dies hier das richtige Unterforum ist.

Also...ich habe ein Programm geschrieben, welches eine Textdatei kopiert, zusammen mit einem zugehörigen GUI. Nichts besonderes, aber ich hätte gerne, dass der Ladevorgang in einem Extrafenster angezeigt wird. Der zugehörige Ladebalken wäre nicht das Problem, aber ich frage mich, wie ich, wenn ich auf einen Button drücke, ein neues Fenster öffne.

Ich hoffe, dass mein Problem verständlich ist.

Falls benötigt, hier der Code.

Java:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Copymakers
{
  String sourcename, destname;
  BufferedReader source;
  PrintWriter dest;
  String line;

  Copymakers(String source, String dest)
  {
    sourcename = source;
    destname = dest;
  }

  public boolean openSourceFile()
  {
    try
    {
      source = new BufferedReader(new FileReader(sourcename));
      return true;
    }
    catch (IOException iox)
    {
      System.out.println("Problem opening " + sourcename);
      return false;
    }
  }

  public boolean openDestinationFile()
  {
    try
    {
      dest = new PrintWriter(new BufferedWriter(new FileWriter(destname)));
      return true;
    }
    catch (IOException iox)
    {
      System.out.println("Problem opening " + destname);
      return false;
    }
  }

  public void closeFiles()
  {
    try
    {
      source.close();
    }
    catch (IOException iox)
    {
      System.out.println("Problem closing " + sourcename);
    }

    dest.close();
  }

  public boolean copyFiles()
  {
    try
    {
      while((line = source.readLine()) != null)
      {
        dest.println(line);
      }
      return true;
    }
    catch (IOException iox)
    {
      System.out.println("Problem reading or writing");
      return false;
    }
  }
}

public class copyprogramm extends JFrame implements ActionListener
{
  String sources, dests;
  
  JLabel src = new JLabel("Enter the name of the sourcefile(10 chars, .txt)");
  JLabel dst = new JLabel("Enter the name of the destinationfile(10 chars, .txt)");
  JTextField result = new JTextField("Give me some work");
  JTextField insrc = new JTextField(14);
  JTextField indst = new JTextField(14);
  JButton push;
  
  JPanel srcp = new JPanel();
  JPanel dstp = new JPanel();
  JPanel rstp = new JPanel();
  
  public copyprogramm()
  {
    push = new JButton("Lets do it");
    setTitle("Copyprogramm");
    result.setEditable(false);
    
    srcp.add(src);
    srcp.add(insrc);
    dstp.add(dst);
    dstp.add(indst);
    rstp.add(result);
    rstp.add(push);
    
    getContentPane().add(srcp);
    getContentPane().add(dstp);
    getContentPane().add(rstp);
    
    push.addActionListener(this);
    
    getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
  }
  
  public void actionPerformed(ActionEvent ex)
  {
    String inData;
    inData = insrc.getText();
    sources = inData;
    
    inData = indst.getText();
    dests = inData;
    
    Copymakers cpm = new Copymakers(sources, dests);
    if (cpm.openSourceFile())
    {
      if (cpm.openDestinationFile())
      {
        if (cpm.copyFiles())
        {
          result.setText("Done");
        }
        else
          result.setText("Problem at copying Files");
      }
      else
        result.setText("Problem with Destination");
    }
    else
      result.setText("Problem with source");

    cpm.closeFiles();
  }
  
  public static void main(String[] args)
  {
    copyprogramm frame = new copyprogramm();

    windowquit wquit = new windowquit();
    frame.addWindowListener(wquit);

    frame.setSize(640, 480);
    frame.setVisible(true);
  }
}

class windowquit extends WindowAdapter
{
  public void WindowClosing(WindowEvent e)
  {
    System.exit(0);
  }
}
 

Volvagia

Top Contributor
So wie das andere Fenster auch.

Java:
JFrame frame = new JFrame();

bar = new JProgressBar(); //Klassenvariable für externen Zugriff.
frame.add(bar, BorderLayout.CENTER);

frame.pack();
frame.setLocationRelativeTo(null); //Oder anderes Frame.
frame.setVisible(true);

Du musst das Kopieren aber in einen anderen Thread auslagern, sonst kann eine Fensteränderung wärend dessen nicht gezeichnet werden.

btw, Klassennamen wenn möglich immer groß schreiben, und für ein JFrame (im Gegensatz zu einen Frame) brauchst du zum Beenden keinen WindowListener mehr.

Java:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Beendet das Programm.
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //"Entsorgt" das Fenster.
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); //Macht das Fenster unsichtbar.
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); //Macht garnichts, ideal für Listener.

edit: Ach ja, ein JDialog wäre dafür vermutlich besser geeignet.
 
Zuletzt bearbeitet:

Shadoka

Mitglied
Danke schonmal für die schnelle Antwort.

Das ich ein neues Frame erschaffen muss habe ich mir schon gedacht, ich weiß nur nicht, wo das innerhalb des Programmcodes geschehen soll. Das Fenster soll ja erscheinen, wenn das Event am JButton push ausgelöst wird...gehört das neue Frame dann auch in actionPerformed?

Und auch das mit dem Thread ist mir nicht ganz klar, ich hatte bisher nichts damit zu tun, gehört das zwangsläufig dazu?

€: Ich benutze glaube ich ein etwas veraltetes Tutorial, vielleicht kommts ja auch daher.
 
G

Gastredner

Gast
Das ich ein neues Frame erschaffen muss habe ich mir schon gedacht, ich weiß nur nicht, wo das innerhalb des Programmcodes geschehen soll. Das Fenster soll ja erscheinen, wenn das Event am JButton push ausgelöst wird...gehört das neue Frame dann auch in actionPerformed?
Jein. Theoretisch solltest du es nicht tun, denn...

Und auch das mit dem Thread ist mir nicht ganz klar, ich hatte bisher nichts damit zu tun, gehört das zwangsläufig dazu?
...Swing besitzt einen eigenen Thread zum Verarbeiten der Events aus der Oberfläche und deren Zeichnung. Dieser sogenannte Event Dispatch Thread ist also daüfr verantwortlich, deine Oberfläche zu zeichnen, und dass bedeutet, dass langlaufende Operationen, die den Thread auslasten, zugleich für die Dauer ihrer Laufzeit deine GUI einfrieren. Das kannst du machen, ist aber hässlich.
Aus diesem Grunde sollte man EDT und (langelaufende) Aktionen trennen, indem man die Aktionen in einem eigenen Thread ausführt und alle Zeichenoperationen (bzw. alle Operationen, die sich auf die GUI auswirken) im EDT.
Ein Beispiel wäre:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Foo extends JFrame implements ActionListener {

	private JButton btnDoSomething;

	public Foo() {
		super("Foo");
		btnDoSomething = new JButton("Klick mich!");
		btnDoSomething.addActionListener(this);
		this.add(btnDoSomething);
		this.pack();
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}

	@Override
	public void actionPerformed(ActionEvent event) {
		Runnable longRunningTask = new Runnable() {

			@Override
			public void run() {
				// Fortschrittsdialog vorbereiten:
				final JProgressBar progress = new JProgressBar(0, 100);
				final JDialog progressDialog = new JDialog(Foo.this, "Langer Task...", true);
				Runnable progressRunnable = new Runnable() {

					@Override
					public void run() {
						progressDialog.add(progress);
						progressDialog.pack();
						progressDialog.setLocationRelativeTo(Foo.this);
						progressDialog.setVisible(true);
					}
				};
				SwingUtilities.invokeLater(progressRunnable);
				// Es folgt die lange Aufgabe:
				for (int i = 0; i < 10; i++) {
					try {
						Thread.sleep(1000);
					} catch (Exception e) {
						e.printStackTrace();
					}
					// Fortschritt darstellen:
					SwingUtilities.invokeLater(new Runnable() {

						@Override
						public void run() {
							progress.setValue(progress.getValue() + 10);
						}
					});
				}
				SwingUtilities.invokeLater(new Runnable() {

						@Override
						public void run() {
							progressDialog.setVisible(false);
							progressDialog.dispose();
						}
					});
			}
		};
		new Thread(longRunningTask).start();
	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {
				Foo foo = new Foo();
				foo.setLocationRelativeTo(null);
				foo.setVisible(true);
			}
		});
	}
}
Dieses Beispiel ist jetzt sicherlich nicht das beste, sollte aber das grundlegende Prinzip aufzeigen: Lange Operationen laufen in einem eigenen Thread, alle Zeichenoperationen werden über [c]SwingUtilities.invokeLater(Runnable)[/c] an den EDT übergeben.
 

Shadoka

Mitglied
Ok, danke für das ausführliche Beispiel.
Dann werde ich mir wohl zunächst einmal die Wirkungsweise von Threads, obwohl ich die schon grob verstanden habe, nochmal genauer anschauen.

In deinem Beispiel gibt es allerdings auch ein paar Sachen, die ich absolut nicht kenne, zum Beispiel die Klasse "Runnable" und das "@Override", wobei ich mir das eventuell mit dem Überschreiben einer Klasse oder Methode erklären könnte.

Wäre nett, wenn du dazu noch was sagen könntest :)
 

Volvagia

Top Contributor
Runnable ist keine Klasse, sondern ein Interface. Das definiert einfach eine oder mehrere Methodensignaturen, wodurch andere Klassen (hier Thread oder SwingUtilities) sichergehen kann, dass eine Methode existiert.
"@Override" ist eine sogenannte annotation, also Anmerkung. Davon gibt es ein paar (wie z. B. "@Deprecated"), die können ober einer Methode oder der Verwendung einer Klasse/Methode innerhalber einer Methode stehen. Dabei gibt z. B. Override an, dass die Methode wirklich überschrieben werden soll, und nicht versehendlich so genannt wird. Deprecated, gibt an, dass die jeweilige Methode veraltert ist. SuppressWarnings("deprecation"), das dir bewusst ist, das eine Methode, die du verwendest, als veraltet gekennzeichnet ist usw.
 
G

Gastredner

Gast
Der Vorteil von @Override ist, dass Tipp- und Logikfehler ausgeschlossen werden. Der Compiler prüft, ob die Methode mit der Annotation tatsächlich eine bestehende Methode überschreibt und bricht bei negativem Ergebnis den Kompiliervorgang ab. Nützlich bei so bösen Fehlern wie [c]public boolean equals(Foo o)[/c] statt [c]public boolean equals(Object o)[/c].
Annotation stehen ab Java 1.5 zur Verfügung.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Verschieben von Buchstaben in einem String um vorgegebene Anzahl von Zeichen innerhalb eines weiteren String Java Basics - Anfänger-Themen 12
Z Erste Schritte Indexe innerhalb eines Arrays zusammensählen Java Basics - Anfänger-Themen 14
M Auf einen Array innerhalb eines Objekts zugreifen Java Basics - Anfänger-Themen 5
dapzoo Innerhalb eines Jahres intensivem Java-Selbststudium zur Anstellung? Java Basics - Anfänger-Themen 37
S Wert innerhalb eines anderen Wertes Java Basics - Anfänger-Themen 3
I Try-Catch innerhalb eines Catchblocks Java Basics - Anfänger-Themen 1
Silvascus Erste Schritte Werte innerhalb eines Arrays addieren Java Basics - Anfänger-Themen 3
L Punkt innerhalb eines Bereiches verschieben Java Basics - Anfänger-Themen 9
S Classpath: Alle .jars innerhalb eines Ordners einbinden Java Basics - Anfänger-Themen 4
T Erste Schritte run innerhalb eines package Java Basics - Anfänger-Themen 1
D Methoden Implementieren von einer Zoomfunktion innerhalb eines JPanels mit null-Layoutmanager Java Basics - Anfänger-Themen 1
M Throws Anweisung innerhalb eines Methodenkopfes unklar Java Basics - Anfänger-Themen 4
M Variablen Zugriff von außerhalb eines Blockes auf eine Variable innerhalb eines Blockes Java Basics - Anfänger-Themen 2
O Files eines Directories innerhalb eines JAR-Files auflisten Java Basics - Anfänger-Themen 0
I JTextfield[] innerhalb eines Itemlistener aufrufen Java Basics - Anfänger-Themen 2
B Zufallsdatum innerhalb eines bestimmten Bereiches erzeugen Java Basics - Anfänger-Themen 3
D OOP Identifzierung eines Objektes innerhalb eines Array Java Basics - Anfänger-Themen 3
G Bewegung innerhalb eines Koordinatensystems berechnen Java Basics - Anfänger-Themen 9
H Innerhalb eines Package wird eine Klassenmethode nicht gefunden. Java Basics - Anfänger-Themen 2
Kaniee Zugriffe innerhalb eines Arrays Java Basics - Anfänger-Themen 9
K Zufällige Auswahl innerhalb eines Arrays und Arrays aus JLabel füllen Java Basics - Anfänger-Themen 32
K Bild mit Maus innerhalb eines Rahmens bewegen Java Basics - Anfänger-Themen 5
S Variablen Variable innerhalb eines if-Statements? Java Basics - Anfänger-Themen 10
E Elemente innerhalb eines Arrays vergleichen Java Basics - Anfänger-Themen 7
radiac Datentypen RANDOM-punkt setzen INNERHALB eines BEREICHes Java Basics - Anfänger-Themen 2
L Timer innerhalb eines Threads Java Basics - Anfänger-Themen 3
C Textausgabe auf Panelen innerhalb eines Applets Java Basics - Anfänger-Themen 6
N aus .txt innerhalb eines JARs Zeilenweise lesen Java Basics - Anfänger-Themen 8
F Verwenden von Input innerhalb eines Applets Java Basics - Anfänger-Themen 3
K innerhalb eines Strings mit RegEx matchen Java Basics - Anfänger-Themen 17
T Auf Objekte innerhalb eines Panels zugreifen Java Basics - Anfänger-Themen 9
H WinHelp innerhalb eines laufenden JavaProgrammes öffnen Java Basics - Anfänger-Themen 15
G properties-Datei innerhalb eines package auslesen Java Basics - Anfänger-Themen 3
G Auf File / Verzeichnis innerhalb eines jars zugreifen Java Basics - Anfänger-Themen 2
S Summe innerhalb eines arrays? Java Basics - Anfänger-Themen 2
F config.xml innerhalb eines Servlets laden Java Basics - Anfänger-Themen 4
M Felder innerhalb eines Arrays vergleichen Java Basics - Anfänger-Themen 2
L Innerhalb eines Strings nach einem Teilstring suchen Java Basics - Anfänger-Themen 2
A Innerhalb eines ActionEvents Eingaben tätigen Java Basics - Anfänger-Themen 23
I Viereck / Rechteck Prüfung innerhalb einem bestimmten Bereich Java Basics - Anfänger-Themen 2
I Innerhalb einem Bild ein Teil austauschen Java Basics - Anfänger-Themen 26
F wie kann ich die Position des letzten Vokals innerhalb einer Zeichenkette ermitteln? Java Basics - Anfänger-Themen 5
J int innerhalb einer Datei ändern Java Basics - Anfänger-Themen 1
J if-Schleife innerhalb einer if-Schleife wird in der Konsole nicht gelesen Java Basics - Anfänger-Themen 4
I Variable innerhalb Methode: Local variable test defined in an enclosing scope must be final or effectively final Java Basics - Anfänger-Themen 3
I ArrayList erstellen innerhalb einer Zeile? Java Basics - Anfänger-Themen 3
B Summe von Property innerhalb einer Liste via Lambda Java Basics - Anfänger-Themen 1
B Enum innerhalb einer Klasse / anderes Konzept Java Basics - Anfänger-Themen 8
T split innerhalb Klammern ignorieren? Java Basics - Anfänger-Themen 6
x-tshainge Innerhalb von Textdatei addieren Java Basics - Anfänger-Themen 9
J Innerhalb von Zeichenketten tauschen Java Basics - Anfänger-Themen 1
S BufferedWriter innerhalb einer Methode Java Basics - Anfänger-Themen 2
H Innerhalb einer Methode eine Variable der aufrufenden Methode ändern? Java Basics - Anfänger-Themen 2
H For-Schleife innerhalb If-Abfrage? Java Basics - Anfänger-Themen 3
A Werte innerhalb von resultset vergleichen Java Basics - Anfänger-Themen 2
B Key auslesen/ausgeben innerhalb von foreach() Java Basics - Anfänger-Themen 5
MiMa abbruch innerhalb einer Rekursiven Schleife Java Basics - Anfänger-Themen 5
J Array innerhalb einer Funktion mehrfach iniatilisieren Java Basics - Anfänger-Themen 4
O Vererbung this innerhalb von super Java Basics - Anfänger-Themen 7
J Innerhalb Interfacemethode: Interface als Attribut Java Basics - Anfänger-Themen 2
I Innerhalb einer Methode suchen und hinzufügen. Neues Objekt in Suche dann? Java Basics - Anfänger-Themen 8
M Farben/Color Abfragen von Farben innerhalb einer Methode Java Basics - Anfänger-Themen 9
I Rückgabe und Aufruf einer Methode innerhalb einer anderen Methode Java Basics - Anfänger-Themen 5
B Variablen global abspeicher innerhalb von Methoden Java Basics - Anfänger-Themen 7
M Text innerhalb Anführungsstriche als "eins" auswerten Java Basics - Anfänger-Themen 5
S Funktionen/Atrribute nur innerhalb einer package Zugänglich machen Java Basics - Anfänger-Themen 8
P Kapselung Variable innerhalb einer inneren Klasse ansprechen ohne ein Objekt erzeugen zu müssen? Java Basics - Anfänger-Themen 6
L Next()-Aufruf zweimal innerhalb einer While-Schleife bei ListIterator Java Basics - Anfänger-Themen 10
W Methodenaufruf innerhalb einer Klasse - static vs. this Java Basics - Anfänger-Themen 3
B for-schleife innerhalb neuer Methode Java Basics - Anfänger-Themen 5
N Innerhalb des Programmes RAM einstellen Java Basics - Anfänger-Themen 2
J Variablen überschreiben innerhalb einer Klasse Java Basics - Anfänger-Themen 7
N Zugriff auf Werte in Arrays innerhalb ArrayList Java Basics - Anfänger-Themen 2
A Zugriff auf Komponente innerhalb einer JPanel Java Basics - Anfänger-Themen 8
A objekt innerhalb der gleiche klasse Java Basics - Anfänger-Themen 10
J Dateien innerhalb einer JAR verwenden Java Basics - Anfänger-Themen 3
J Innerhalb der Border zeichnen Java Basics - Anfänger-Themen 9
P Unterschied JRE innerhalb/ außerhalb des JDK Verzeichnisses? Java Basics - Anfänger-Themen 5
S Input/Output Problem mit dateizugriff innerhalb der .jar (Applet) Java Basics - Anfänger-Themen 2
E Zeile innerhalb Datei überschreiben Java Basics - Anfänger-Themen 2
K Methoden Zustand innerhalb einer Instanz ändern Java Basics - Anfänger-Themen 2
M Java-Prog soll Texte innerhalb Bildern erkennen Java Basics - Anfänger-Themen 2
N OOP Zugriff auf eine Objekt innerhalb einer Klasse aus statischen Methoden Java Basics - Anfänger-Themen 9
M Main methode innerhalb von Java aufrufen Java Basics - Anfänger-Themen 11
A lokale Variable innerhalb "actionPerformed()" Java Basics - Anfänger-Themen 10
L Lokale Variable und Instanzvariable innerhalb Iterator Java Basics - Anfänger-Themen 8
M FileWriter innerhalb runnable Jar Java Basics - Anfänger-Themen 8
J Diverse Frag zu Vererbung innerhalb von Java Java Basics - Anfänger-Themen 6
O Änderungen innerhalb for-Schleife speichern Java Basics - Anfänger-Themen 17
J Wie auf eine Datei innerhalb des JAR-Files zugreifen Java Basics - Anfänger-Themen 2
T switchcase innerhalb Schleife: von case-Fall aus Schleife beenden Java Basics - Anfänger-Themen 3
H Klassen zur Anzeige ines Bildes und zum Zeichnen innerhalb diese Bildes Java Basics - Anfänger-Themen 2
D Datei innerhalb einer zip bearbeiten Java Basics - Anfänger-Themen 8
D .class-Datei innerhalb einer .jar-Datei verändern Java Basics - Anfänger-Themen 4
R Interface innerhalb einer Klasse definieren..? Java Basics - Anfänger-Themen 2
M Methode innerhalb Methode Java Basics - Anfänger-Themen 10
C Variable Zeichenkette innerhalb einer Schleife ersetzen Java Basics - Anfänger-Themen 4
Das Brot Relative Pfadangaben innerhalb von .jar Archiven Java Basics - Anfänger-Themen 7
Screen Mouserobot clonen? Zeiger nur innerhalb eins Fensters? Java Basics - Anfänger-Themen 3
E Boolean wert innerhalb einer Tabelle ändern Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben