Zum Inhalt springen

2 Probleme mit GUI


Micronate

Empfohlene Beiträge

Hallo,

Vorab schon mal ich habe nicht die mords Ahnung von Java und einige Sachen sind bestimmt auch nicht gerade toll gelöst :D

Info zu meinem Programm:

Ich habe das Programm auf 3 Klassen aufgeteilt. Die Klassen für das Fenster, Abfrage und eine Klasse die mir vorab schon eine HTML-Datei erstellt mit dem aktuellen Datum im Namen in das später durch das Abfrageprogramm weitere Daten hinengeschrieben wird. Hierbei handelt es sich um eine Abfrage bestimmter Werte von Druckern die in einem deutschlandweitem Netzwerk eingebunden sind.

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class LexStatsHaupt extends JPanel

{

//Statusbalken

JProgressBar bar = new JProgressBar( 0, 1000000 );

//Statusbalken

//Listener für Exit/Abbruch

static class ButtonListener2 implements ActionListener

{public void actionPerformed( ActionEvent e )

{System.exit(0);}};

//Listener für Exit/Abbruch

//Listener für Statusbalken

public class ButtonListener implements ActionListener

{public void actionPerformed( ActionEvent e )

{new Thread( new Runnable()

{public void run()

{for ( int i = 1; i <= bar.getMaximum(); ++i )

{final int j = i;

SwingUtilities.invokeLater( new Runnable()

{public void run(){bar.setValue( j );}

});

}

}

}).start();

}

}//Listener für Statusbalken

public LexStatsHaupt() throws Exception

{

try

{

//Fenster

JFrame gui = new JFrame();

gui.setSize(400,300);

gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

gui.setTitle("Druckerabfrage zu Lexmark X644e");

//Fenster

//Image in Titelleiste

Toolkit tk = gui.getToolkit();

Image image = tk.getImage( "printer.GIF" );

while ( !tk.prepareImage( image, -1, -1, gui))

{

try {

Thread.sleep( 100 );

} catch ( Exception e ) {}

}

gui.setIconImage( image );

//Image in Titelleiste

//Buttons, Checkboxen, Bild und Panels

JButton scan = new JButton("Start");

scan.addActionListener( new ButtonListener() );

JButton exit = new JButton("Exit");

exit.addActionListener( new ButtonListener2() );

JButton abbruch = new JButton("Abbruch");

CheckboxGroup cbg = new CheckboxGroup();

Checkbox zehn = new Checkbox("17er Netz",cbg,true);

Checkbox dreisig = new Checkbox("37er Netz",cbg,false);

Checkbox fuenfzig = new Checkbox("51er Netz",cbg,false);

JPanel pnlNorth = new JPanel(new FlowLayout());

JPanel pnlSouth = new JPanel(new FlowLayout(FlowLayout.RIGHT));

JLabel imageLabel= new JLabel(new ImageIcon("printer.gif"));

gui.getContentPane().add(imageLabel);

pnlNorth.add(zehn);

pnlNorth.add(dreisig);

pnlNorth.add(fuenfzig);

gui.add(pnlNorth,BorderLayout.NORTH);

pnlSouth.add(scan);

pnlSouth.add(abbruch);

pnlSouth.add(exit);

pnlSouth.add(bar, FlowLayout.LEFT);;

gui.add(pnlSouth,BorderLayout.SOUTH);

//Buttons, Checkboxen, Bild und Panels

//Sichtbarkeit des Fensters

gui.show();

//Sichtbarkeit des Fensters

}

catch(Exception e)

{

e.printStackTrace();

}

}

public static void main(String args[])

{

try

{

new LexStatsHaupt();

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

Ich habe noch ein Bild des Fensters angehängt wie es mit dem alten Code ausgesehen hat.

Problem 1)

Ich habe ein selbst geschriebenes Programm "Abfrage" das ich in einem Fenster über einen Button in diesem Fenster starten will. Ich habe das Fenster soweit fertig gecodet und wollte es in einen "schönen Rahmen" bringen weil ich in dem Test viele Methoden und Zeug immer wieder mit "//" als Kommentar ausgegrenz habe. Im neuen "schön geschrieben" Code habe ich das Fenster in einem extra Konstruktur geschrieben und diesen in der Main aufgerufen. Im alten Code war das komplette Fenster in der Main codiert. Nun habe bei dem neuen Code das Problem dass das Fensterprogramm zwar läuft, aber das Fenster nicht anzeigt wird oder kein Inhalt vorhanden ist. Ich habe schon versucht die "gui.show()" an verschiedene Stellen zu setzen und weis im Moment aber nicht mehr weiter.

Problem 2)

Wie man im Code sehen kann habe ich einen ButtonListener für den StartButton der die Statusleiste startet. Hierbei weis ich nun nicht wie und wo ich einbinde das er das Abfragerogramm startet und wie ich die Statusleiste dazu verknüpfe. Wenn ich auf Start klicke wird die Statusleiste ausgeführt und läuft in ca. 10sec. durch auf 100%. Nun braucht das eigentliche Programm viel viel länger als 10sec. Hier muß man doch irgendwie abfragen können wie weit das Programm ist oder?

Danke für Eure Antworten schon mal im Voraus. Wenn ich Infos vergessen haben sollte einfach nochmal nachfragen ;)

post-34160-1443044798402_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

zu allererst, benutze anstatt der Methode Component.show()lieber die Methode Component.setVisible(boolean). Die show() - Methode ist als deprecated gekennzeichnet, und sollte deshalb möglichst nicht mehr benutzt werden.

Dann zu deinem ersten Problem. So wie ich dich jetzt verstanden habe, hast du dein zweites Fenster dass du anzeigen lassen willst, als eigene Klasse definiert. Um das nun anzeigen lassen zu können, musst du von dieser Klasse nen eigenes Objekt erzeugen (DeinFenster dk = new DeinFenster()) und rufst auf DIESEM Objekt die Methode setVisible(true) auf. Nicht auf deinem gui Objekt. Weil das gui Objekt ist nur für dein Hauptfenster zuständig. Um das zweite Fenster anzuzeigen musst du auf dem entsprechendem Objekt die Methode aufrufen.

Und wenn du das Fenster anzeigen lassen willst, sobald der Benutzer auf einen Button klickt, erzeugst du dafür einfach einen neuen JButton, fügst ihm einen ActionListener hinzu und erstellst in der Methode actionPerformed(ActionEvent) einfach das Objekt deines zweiten Fensters und setzt es sichtbar.

Zu deinem zweiten Problem, bisher läuft deine JProgressBar einfach nur einmal durch, weil du es auch so programmiert hast <ahttp://devipb.fachinformatiker.de/uploads/emoticons/default_wink.png' alt=';)'> In dem von dir erzeugten Thread läuft nämlich eine Schleife einfach 1 Millionen mal durch und setzt jedesmal den Wert der JProgressBar eins höher.

Das dürfte natürlich nicht unbedingt die Funktion sein, die du dir vorgestellt hast.

Um dort den Fortschritt deines zweiten Programmabschnittes anzeigen lassen zu können. Musst du in regelmäßigen abständen dieses abfragen wie weit es ist, bzw. wie viel Prozent seiner Arbeit es bereits erledigt hat. Und anhand dieses Wertes kannst du dann auch die JProgressBar setzen.

Und was mir dann gerade beim ausprobieren des Codes aufgefallen ist. Folgenden Code solltest du nochmal überarbeiten.


//Image in Titelleiste

Toolkit tk = gui.getToolkit();

Image image = tk.getImage( "printer.GIF" );

while ( !tk.prepareImage( image, -1, -1, gui))

{

	try {

		Thread.sleep( 100 );

	} catch ( Exception e ) {}

}

gui.setIconImage( image );

//Image in Titelleiste

Weil wenn wie bei mir das Bild nicht vorhanden ist, dann läuft er dort in einer Endlosschleife immer weiter.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erst mal vielen Dank für die schnelle Antwort.

Ich hab mich glaub ich falsch ausgedrückt. Ich habe nur 1 Fenster. Es soll kein 2. erscheinen. Wenn ich auf den StartButton klicke soll das andere Programm das die Abfrage macht im Hintergrund laufen und mir durch die JProgressbar anzeigen wann es fertig ist. Das Programm schreibt 3 HTML-Dateien die mir sagen welche IP nicht/erreicht wurde und z.B. wie viele Ausdrucke der Drucker hat. Die IP-Adressen liest es aus einer .txt-Datei.

Das mit Component.show() muß ich erst nachlesen, da wir in der Schule(mach noch Ausbildung zum FISI) noch kein Java Swing und JFrame durchgenommen haben. Ich hab mir alles was mit Swing und JFrame zu tun hat einfach aus Beispielen zusammen geschustert. In erster Linie wollt ich wissen was in dem Code falsch positioniert ist weswegen das Fenster nicht angezeigt wird.

Und was mir dann gerade beim ausprobieren des Codes aufgefallen ist. Folgenden Code solltest du nochmal überarbeiten.

Code:

//Image in Titelleiste

Toolkit tk = gui.getToolkit();

Image image = tk.getImage( "printer.GIF" );

while ( !tk.prepareImage( image, -1, -1, gui))

{

try {

Thread.sleep( 100 );

} catch ( Exception e ) {}

}

gui.setIconImage( image );

//Image in Titelleiste

Weil wenn wie bei mir das Bild nicht vorhanden ist, dann läuft er dort in einer Endlosschleife immer weiter.

Wie meinst Du das mit der Endlosschleife. Wie zeigt sich das bei Dir?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ach so.

Nagut, damit die JProgressBar dann trotzdem die richtigen Werte anzeigt, muss du entweder ne Referenz dieser an deinen zweiten Programmteil übergeben, damit dieser dann den Wertezuwachs vornimmt sobald er bestimmte Arbeit beendet hat.

Oder du fügst deinem Programmteil eine Methode hinzu, die zurück gibt wie viel Prozent der Arbeit zu dem Zeitpunkt schon abgearbeitet wurden.

Und diese Methode rufst du dann in nem Thread in regelmäßigen Abständen auf und aktualisierst die JProgressBar entsprechend.

Und dies machst du alles einfach in deinem ButtonListener, den du ja schon als ActionListener für deinen Button benutzt.

Und die Endlosschleife zeigt sich ganz einfach dadurch bei mir, dass das Programm läuft aber sichtbar keine Arbeit verrichtet. zB wird auch das Fenster erst garnicht angezeigt. Das passiert wahrscheinlich, weil die prepareImage(), auch wenn das Bild garnicht existiert, immer false zurückgibt, wodurch die Schleife ewig weiterläuft.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nochmals Danke für Deine Hilfe.

Dass mit der Endlosschleife hab ich erledigt.

Nun bin ich immernoch am rätseln wie ich das mit der Methode mache die mir den Prozentsatz zurück gibt. Das Abfrageprogramm liest eine IP aus der .txt-Datei, dann erfragt er die verschiedenen Werte, schreibt diese in die HTML-Tabellen und fängt dann wieder von vorne an solange die Methode .nextLine != null ist.

Meine Überlegung

Schritt 1

Könnte ich einfach die Anzahl der Zeilen in der .txt auslesen, in eine Variable schreiben und dann diese Variable als Maximumwert der JProgressbar deklarieren? Also:


JProgressBar bar = new JProgressBar( 0, zeilenGesamt);

Schritt 2 Wenn ich in die while-Schleife durch die das ganze Abfrageprogramm läuft auch noch eine Variable einbaue die nach jedem Durchlauf eins hoch zählt, kann ich diese dann (ich denke in die Variable "j" weiß es aber nicht genau :( ) in den ActionListener so zusagen als Status einfügen? Wenn ja muß ich extra etwas schreiben das es den Balken dann regelmäßig aktualisiert?

//Listener für Statusbalken

	public class ButtonListener implements ActionListener 

	{public void actionPerformed( ActionEvent e ) 

	  {new Thread( new Runnable() 

	    {public void run() 

	      {for ( int i = 1; i <= bar.getMaximum(); ++i ) 

	        {final int j = i;

	         SwingUtilities.invokeLater( new Runnable() 

	         {public void run()

	         {bar.setValue( j );} 

	         }); 

	        }

	      } 

	    }).start();  

	   } 

	  }//Listener für Statusbalken

Wie immer schon mal Danke im Voraus :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...