Wie kann ich meinen Code verbessern?

Aibo

Mitglied
Hallo liebes Java-Forum,

das Programm funktioniert einwandfrei jedoch möchte ich mir Tipps einholen, wie ich den Quellcode verbessern kann.

mein Projekt sieht folgendermaßen aus:

ImageShack® - Online Photo and Video Hosting

und hier ist der Code. Es sind nicht alle Klassen nur die Gui Klasse damit ich das forum nich mit einer Vielzahl an Klassen erschlage^^

Java:
/* Listing3702.java */

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class ContactManager
extends JFrame implements ActionListener, KeyListener
{

  //Labels
  protected  JLabel labLastName;
  protected  JLabel labForeName;
  protected  JLabel labAdress;
  protected  JLabel labLocation;
  protected  JLabel labLocationNumber;
  protected  JLabel labLand;
  protected  JLabel labTelephone;

  //TextFields
  private JTextField txtLastName;
  private JTextField txtForeName;
  private JTextField txtAdress;
  private JTextField txtLocation;
  private JTextField txtLocationNumber;
  private JTextField txtTelephone;

  //ComboBox
  private JComboBox boxLand;

  //Buttons
  private JButton btnGenerate;
  private JButton btnReset;


  public ContactManager()
  {
	super("ContactManager v.1.1");
	setSize(800,300);
 	setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
	buildGui();
  }

  public void buildGui()
  {
	  	//Layout
	  	setLayout( new GridLayout(/*3*/ 0, 2, 6, 3) );

	  	//Labels
	  	labLastName = new JLabel("Nachname: ");
	  	labForeName = new JLabel("Vorname: ");
	  	labAdress = new JLabel("Adresse: ");
	  	labLocation = new JLabel("Ort: ");
	  	labLocationNumber = new JLabel("PLZ: ");
	  	labLand = new JLabel("Land: ");
	  	labTelephone = new JLabel("Telefonnummer: ");

	  	//Textfields
	  	txtLastName = new JTextField();
	  	txtLastName.addKeyListener(this);
	  	txtForeName = new JTextField();
	  	txtForeName.addKeyListener(this);
	  	txtAdress = new JTextField();
	  	txtAdress.addKeyListener(this);
	  	txtLocation = new JTextField();
	  	txtLocation.addKeyListener(this);
	  	txtLocationNumber = new JTextField();
	  	txtLocationNumber.addKeyListener(this);
	  	txtTelephone = new JTextField();
	  	txtTelephone.addKeyListener(this);

	  	//ComboBox
	  	boxLand = new JComboBox();
	  	for(String country : EuropeCountries.countries)
	  		boxLand.addItem(country);

	  	//Buttons
	  	btnGenerate = new JButton("Weiter");
	  	btnGenerate.setEnabled(false);
	  	btnGenerate.addActionListener(this);

	  	btnReset = new JButton("Reset");
	  	btnReset.addActionListener(this);


	  	//Nachname:
	  	add(labLastName);
	  	add(txtLastName);

	  	//Vorname:
	  	add(labForeName);
	  	add(txtForeName);

	  	//Adresse:
	  	add(labAdress);
	  	add(txtAdress);

	      //Ort:
	  	add(labLocation);
	  	add(txtLocation);

	      //PLZ:
	  	add(labLocationNumber);
	  	add(txtLocationNumber);


	      //Telefonnummer:
	  	add(labTelephone);
	  	add(txtTelephone);

	  	   //Land:
		add(labLand);
	  	add(boxLand);

	  	add(btnGenerate);
	  	add(btnReset);

	setVisible( true );
  }

  public void resetTextFields()
  {
	  txtLastName.setText("");
	  txtForeName.setText("");
	  txtAdress.setText("");
	  txtLocation.setText("");
	  txtLocationNumber.setText("");
	  txtTelephone.setText("");

	  btnGenerate.setEnabled(false);
  }



  public void buttonControl()
  {
	  boolean hasValue =!txtLastName.getText().equals("") &
	  				    !txtForeName.getText().equals("") &
	  				    !txtAdress.getText().equals("") &
	  				    !txtLocation.getText().equals("") &
	  				    !txtLocationNumber.getText().equals("") &
	  				    !txtTelephone.getText().equals("");

	  if(hasValue){
	  btnGenerate.setEnabled(true);
  	  }
	  else{
	  btnGenerate.setEnabled(false);
 	  }
  }

  public Contact generateContact()
  {
	  return  	new Contact(
	  	  		txtLastName.getText(),
	  	  		txtForeName.getText(),
	  	  		txtAdress.getText(),
	  	  		txtLocation.getText(),
	  	  		txtLocationNumber.getText(),
	  	  		txtTelephone.getText(),
	  	  		boxLand.getSelectedItem().toString()
	  	  						);
  }

   public void keyPressed(KeyEvent arg0) {
			buttonControl();
   }

   public void keyReleased(KeyEvent arg0) {
			buttonControl();
   }


   public void keyTyped(KeyEvent arg0) {}

   public void actionPerformed(ActionEvent ae)
   {
	 if(ae.getSource().equals(btnGenerate) ){
		if(checkForDigits(txtLocationNumber.getText() ) & checkForDigits(txtTelephone.getText())  ){
		new ConfirmationFrame(generateContact());
		}
		else
		{
			 JOptionPane.showMessageDialog(null,"PLZ bzw. Telefonnummer enthalten Buchstaben","False",JOptionPane.ERROR_MESSAGE);
		}
	 }

	  if(ae.getSource().equals(btnReset) ){
		 resetTextFields();
	  }
  }

 public boolean checkForDigits(String value)
   {
       char[] valueArray = value.toCharArray();

       for(int i=0; i<valueArray.length; i++)
       {
             if(!(Character.isDigit(valueArray[i])||valueArray[i]=='/')){
                  return false;
             }
        }
 		return true;
}
}

Vielen Dank im Vorraus.
 
J

J7Dev

Gast
1) SomeClass extends JFrame ... ist schon mal Blödsinn. Es gibt zwar sehr wenige Ausnahmen in denen das Sinn machen könnte, aber in der Regel erweitert man keine Klasse wenn man nicht noch etwas zu ihrer bisherigen Funktionsweise hinzufügen oder ändern möchte. Anstatt also eine Klasse zu verwenden die von JFrame ableitet solltest du lieber eine Variable vom Typ JFrame nehmen und damit arbeiten.

2) setVisible() im Konstruktor ... ist auch ein absolutes NO-GO! setVisible() gehört IMMER in den caller. Dein Konstruktor callt als letztes buildGui() und die wiederum als letztes setVisible() womit setVisible() immer noch im Konstruktor steht. Wenn überhaupt dann gehört diese Zeile unter die in der die Klasse instanziert wurde, also in die Klasse die "ContactManager" instanziert. Da aber wie bei 1 genannt es bei dir eh keinen Sinn hat eine extra Klasse zu verwenden die von JFrame ableitet kannst du den ganzen code so wie er ist nehmen und in deine andere Klasse stecken. Dort steht dann irgendwo erstmal private JFrame gui; als deklaration, irgendwo weiter unten dann gui=new JFrame(); ... dann die ganzen anderen Methoden wie setXXX() oder addXXX() ... und dann ganz am ende erst das setVisible(), wobei du alles in Methoden unterteilen solltest.

3) SomeClass implements XXXListener ... beliebter Anfängerfehler und sollte man so nicht machen da die Klasse sonst nach außen zu einem public Listener wird was du sicher nicht willst. Besser ist es mit anonymen inneren Klassen zu arbeiten und dann aus diesen die gewünschten Methoden als Threads callen um den EDT nicht zu blockieren.

Mir würden noch ein paar andere Dinge einfallen die aber Erfahrungswerte sind. Alles in allem würde ich das was du vorhast ganz anders schreiben. Um dir mal ein sauberes Beispiel zu zeigen fehlen aber die restlichen Klassen.
 

Aibo

Mitglied
okay zuerst vielen Dank für die ganzen Informationen.

Ich habe hier mal die ganzen Klassen aufgeführt.

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;

public class ConfirmationFrame extends JFrame implements ActionListener
{
	private JLabel labLastName;
	private JLabel labForeName;
	private JLabel labAdress;
	private JLabel labLocation;
	private JLabel labLocationNumber;
	private JLabel labLand;
	private JLabel labTelephoneNumber;

	private Border border;

	private JButton btnExport;

	public ConfirmationFrame(final Contact contact)
	{
		super("Bestätigungsdialog");
		setVisible(true);
		setSize(400,150);

	    setLayout( new GridLayout(/*3*/ 0, 2, 6, 3) );

	    		//Border
	    		Border border = LineBorder.createGrayLineBorder();

				//Labels
				labLastName = new JLabel("Nachname: "+ contact.getLastName() );
				labForeName = new JLabel("Vorname: "+ contact.getForeName() );
				labAdress = new JLabel("Adresse: " + contact.getAdress() );
				labLocation = new JLabel("Ort: " + contact.getLocation() );
				labLocationNumber = new JLabel("PLZ: " + contact.getLocationNumber() );
				labTelephoneNumber = new JLabel("Telefonnummer: " + contact.getTelephoneNumber() );
				labLand = new JLabel("Land: " + contact.getLand() );

				labLastName.setBorder(border);
				labForeName.setBorder(border);
				labAdress.setBorder(border);
				labLocation.setBorder(border);
				labLocationNumber.setBorder(border);
				labTelephoneNumber.setBorder(border);
				labLand.setBorder(border);

				btnExport = new JButton("Export");
				btnExport.addActionListener(new ActionListener()
				{
					public void actionPerformed(ActionEvent e ){
						TextWriter.Write(contact);
						setVisible(false);
					}
				});

				add(labLastName);
				add(labForeName);
				add(labAdress);
				add(labLocation);
				add(labLocationNumber);
				add(labTelephoneNumber);
				add(labLand);
				add(btnExport);

	}

		public void actionPerformed(ActionEvent arg0) {
	}
}

Java:
public class Contact extends Object
{
	private String lastName;
	private String foreName;
	private String adress;
	private String location;
	private String locationNumber;
	private String telephoneNumber;
	private String land;

	public String getLastName()
	{
		return lastName;
	}

	public void setLastName(String lastName)
	{
		this.lastName = lastName;
	}

	public String getForeName()
	{
		return foreName;
	}

	public void setForeName(String foreName)
	{
		this.foreName = foreName;
	}

	public String getAdress()
	{
		return adress;
	}

	public void setAdress(String adress)
	{
		this.adress = adress;
	}

	public String getLocation()
	{
		return location;
	}

	public void setLocation(String location)
	{
		this.location = location;
	}

	public String getLocationNumber()
	{
		return locationNumber;
	}

		public void setLocationNumber(String locationNumber)
	{
		this.locationNumber = locationNumber;
	}

	public String getTelephoneNumber()
	{
		return telephoneNumber;
	}

	public void setTelephoneNumber(String telephoneNumber)
	{
		this.telephoneNumber = telephoneNumber;
	}

	public String getLand()
	{
		return land;
	}

	public void setLand(String land)
	{
		this.land = land;
	}

	public Contact(String lastName, String foreName, String adress
	, String location, String locationNumber, String telephoneNumber, String land  )
	{
		setLastName(lastName);
		setForeName(foreName);
		setAdress(adress);
		setLocation(location);
		setLocationNumber(locationNumber);
		setTelephoneNumber(telephoneNumber);
		setLand(land);
	}


}

Java:
public class ContactManagerProgram
{
	  public static void main(String[] args)
	  {
	    new Login();
  	  }
}

Java:
public class EuropeCountries
{
	public static String[] countries = new String[]{
								"Albanien",
								"Belgien",
								"Bosnien und Herzegowina ",
								"Bulgarien",
								"Dänemark",
								"Deutschland",
								"Estland",
								"Finnland",
								"Frankreich",
								"Griechenland",
								"Irland",
								"Island",
								"Italien",
								"Kasachstan",
								"Kosovo",
								"Kroatien",
								"Lettland",
								"Liechtenstein",
								"Litauen",
								"Luxemburg",
								"Malta",
								"Mazedonien",
								"Moldawien",
								"Monaco",
								"Montenegro",
								"Niederlande",
								"Norwegen",
								"Österreich",
								"Polen",
								"Portugal",
								"Rumänien",
								"Russland",
								"San Marino",
								"Schweden",
								"Schweiz",
								"Serbien",
								"Slowakei",
								"Slowenien",
								"Spanien",
								"Tschechien",
								"Türkei",
								"Ukraine",
								"Ungarn",
								"Vatikanstadt" ,
								"Vereinigtes Königreich",
								"Weißrussland"
							};
}

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

public class Login
{

public Login()
{
	loginWindow();
}

public void loginWindow()
{
	 String userName = "marcel";
	 String userPassword = "abend";

	 JPanel panel=new JPanel();

	 panel.setLayout(new GridLayout(4,1));

	 JLabel username=new JLabel("Username");
	 JLabel password=new JLabel("Password");

	 JTextField textField=new JTextField(12);

	 JPasswordField passwordField=new JPasswordField(12);

	 panel.add(username);
	 panel.add(textField);
	 panel.add(password);
	 panel.add(passwordField);

	 int a=JOptionPane.showConfirmDialog(null,panel,"Anmeldedaten",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);

	 if(a==JOptionPane.OK_OPTION)
	 {
	  boolean correctUserData = textField.getText().equals(userName)& passwordField.getText().equals(userPassword);
	  if(correctUserData)
	  {
	   new ContactManager();
	  }
	  else
	  {
	   JOptionPane.showMessageDialog(null,"Falsche Anmeldedaten","False",JOptionPane.ERROR_MESSAGE);
	   loginWindow();
	  }
	 }

	 //Operation that will do when user click 'Cancel'
	 else if(a==JOptionPane.CANCEL_OPTION)
	 {
	  System.exit(0);
  }
 }
}

Java:
import java.io.*;

public class TextWriter {

 public static void Write(Contact contact)
 {
	String fileName = "Adressen.txt";
		try{

			 BufferedWriter outputStream = new BufferedWriter(
			                new OutputStreamWriter(
			                new FileOutputStream( "Adressen.txt", true )));

			  outputStream.write("Nachname: " + contact.getLastName());
			  outputStream.newLine();
			  outputStream.write("Vorname: " + contact.getForeName());
			  outputStream.newLine();
			  outputStream.write("Adresse: " + contact.getAdress());
			  outputStream.newLine();
			  outputStream.write("Ort: " + contact.getLocation());
			  outputStream.newLine();
			  outputStream.write("PLZ: " + contact.getLocationNumber());
			  outputStream.newLine();
			  outputStream.write("Telefonnummer: " + contact.getTelephoneNumber());
			  outputStream.newLine();
			  outputStream.write("Land: " + contact.getLand());
			  outputStream.newLine();
			  outputStream.write("------------------------------------------------------");
			  outputStream.newLine();
			  outputStream.close();
		 }catch(Exception e){
			  System.out.println(e);
		  }


 	}
}

Sorry, dass ich so viele Klassen poste.
 

DaveIT

Mitglied
Java:
public class TextWriter {
 
 public static void Write(Contact contact)
 {
    String fileName = "Adressen.txt";
        try{
 
             BufferedWriter outputStream = new BufferedWriter(
                            new OutputStreamWriter(
                            new FileOutputStream( "Adressen.txt", true )));
 
              outputStream.write("Nachname: " + contact.getLastName());
              outputStream.newLine();
              outputStream.write("Vorname: " + contact.getForeName());
              outputStream.newLine();
              outputStream.write("Adresse: " + contact.getAdress());
              outputStream.newLine();
              outputStream.write("Ort: " + contact.getLocation());
              outputStream.newLine();
              outputStream.write("PLZ: " + contact.getLocationNumber());
              outputStream.newLine();
              outputStream.write("Telefonnummer: " + contact.getTelephoneNumber());
              outputStream.newLine();
              outputStream.write("Land: " + contact.getLand());
              outputStream.newLine();
              outputStream.write("------------------------------------------------------");
              outputStream.newLine();
              outputStream.close();
         }catch(Exception e){
              System.out.println(e);
          }
 
    }
}

Methoden werden klein geschrieben! Wenn du dir eine Klasse baust die etwas spezifisches tut benenn sie eindeutig z.B.: AdressWriter.

Die Variable fileName wird nicht verwendet.
outputStream als Bezeichner für einen BufferedWriter (auch wenn er in einen OutputStream schreibt) ist verwirrend. Einfach writer würde genügen.

Ich würde die Exception nicht abfangen sondern weitergeben. Wenn du eine GUI hast führst du das Programm ja nicht mit Konsole aus und siehst daher die Fehlermeldung nicht.

LG
 

Marco13

Top Contributor
"Was könnte man an diesem Code verbessern?". Falls jemand glaubt, Code schreiben zu können, zu dem ich in bezug auf diese Frage keine Antwort schreiben könnte, dann möge er sein Glück versuchen. (Das ist nicht so anmaßend gemeint, wie es im ersten Moment klingen mag: Ich schaff' das selbst nicht :oops: ). Es ist immer nur eine Frage der Ansprüche, und des Aufwandes, den man zu investieren bereit ist. Und letzteres bezieht sich auch auf den Aufwand, den jemand fremdes bereit ist, die die Beantwortung so einer Frage in einem Forum zu investieren ;)

Beim ersten Überfliegen:
- [c]// Kein Kommentar[/c]
- Alles, was J7Dev schon geschrieben hat ;)
- Müssen alle Klassen public sein?
- Naming conventions beachten
- Die ungarische Notation mit Typ-Präfixen für Variablennamen ist sooo 1980 :noe:
- Der Scope von Variablen sollte so klein wie möglich sein. Die mit großem Abstand wichtigste Ausprägung dieser Regel ist: Man sollte NUR das zu Fields (Instanzvariablen) machen, was man unbedingt braucht. Die ganzen Labels und Border im ConfirmationFrame sind schlicht überflüssig. Die bräuchte man nur, wenn man ihren Text später ändern wollte.
- extends Object ?! :autsch:
- EuropeCounties sollte nicht instanziierbar sein (privaten Konstruktor verwenden)
- Der public Array in EuropeCountries sollte bestenfalls (wenn überhaupt) eine
public static final List<String> COUNTRIES = Arrays.asList(...derArray...)
sein - ich würde es eher in eine Methode packen, die diese Liste dann zurückgibt. Internationalization würde jetzt wohl zu weit führen ;)
- Wer kann den "Contact" wann ändern? Werden sie setter wirklich gebraucht?
- Alles, was DaveIT geschrieben hat ;)
- Bei sowas wie dem TextWriter (alias AddressWriter) (der auch nicht instantiierbar sein sollte) bietet sich ggf. so ein Muster an wie
Java:
public class AddressWriter
{
    // Kommentar, dazusagen dass der Aufrufer den Stream closen muss!
    static void write(Contact contact, OutputStream outputStream) throws IOException {
    ....
    }

    // Falls notwendig / gewünscht:
    static void write(Contact contact, String fileName) throws IOException 
    {
         OutputStream outputStream = null;
         try
         {
             outputStream = new FileOutputStream(fileName);
             write(contact, outputStream);
             outputStream.close();
         }
         finally 
         {
             if (outputStream != null)
             {
                 try
                 {
                     outputStream.close();
                 }
                 catch (IOException e)
                 {
                     logSomewhere(e);
                 }
             }
         }
         // (Ja, das ist so kompliziert, außer by "try with resources" von Java 7)
    }

}
 

Landei

Top Contributor
Das was mich am meisten an deinem Code stört ist das [c]extends JFrame[/c] und das [c]implements ActionListener[/c]. Es gibt nämlich eine wichtige Daumenregel, die ich aus Erfahrung nur bestätigen kann: besser Komposition als Vererbung. Ist deine Klasse wirklich ein [c]ActionListener[/c]? Oder sollte sie lieber welche verwenden? Ist deine Klasse eine spezielle Version von [c]JFrame[/c], oder braucht sie nur eines, um ihre Daten darzustellen? Oder anders gefragt: Was wäre, wenn du deine GUI auf SWT umstellen würdest, würde dann [c]ContactManager[/c] prinzipiell anders funktionieren? Ich denke nicht, denn die eigentliche Aufgabe der Klasse ist es, über eine GUI Kontakte zu managen, und nicht, ein JFrame zu sein.

Es geht auch anders:
Java:
public class ContactManager {
  private JFrame frame;

   public ContactManager() {
       frame = new JFrame("ContactManager v.1.1"); 
       frame.setSize(800,300);
       ...
   }

  public void buildGui() {
        ... 
        JButton btnGenerate = new JButton("Weiter");
        btnGenerate.addActionListener(new ActionListener(){
           public void actionPerformed(ActionEvent ae) { 
              doGenerate();
           }  
        });
        ... 
  } 
  
  private void doGenerate() {
      ...
  } 

}
 
B

bone2

Gast
noch ein paar kleinigkeiten
rück einheitlich ein: das schwankt zwischen 0, 3, 4 und 8

Java:
      if(hasValue){
          btnGenerate.setEnabled(true);
      }
      else{
          btnGenerate.setEnabled(false);
      }
einfacher:
Java:
btnGenerate.setEnabled(hasValue);
 

Jens81

Gesperrter Benutzer
Ich habe eine Frage bzgl. "kein setVisible()" im Konstruktor.

Beispiel:
Java:
public class FensterHaupt {

	public FensterHaupt() {
		createGUI();
	}
	
	public void createGUI() {
		JFrame fenster = new JFrame();
		fenster.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		fenster.setSize(100,100);
		
		JButton button = new JButton("Klick");
		button.addActionListener(new ActionListener() {		
			@Override
			public void actionPerformed(ActionEvent e) {
				new FensterInnen();
			}
		});
		fenster.add(button);
		
		fenster.setVisible(true);
	}
	
	public static void main(String[] args) {
		new FensterHaupt();
	}
}

Java:
public class FensterInnen {

	public FensterInnen() {
		createGUI();	
	}
	
	public void createGUI() {
		final JDialog fenster = new JDialog();
		fenster.setSize(200,200);
		
		SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {	
			@Override
			protected Void doInBackground() throws Exception {
				try {
					Thread.sleep(5000);
					System.out.println("Daten Geladen");
				} catch (Exception e) {
					e.printStackTrace();
				}
				
				return null;
			}
			
			@Override
			protected void done() {
				//Fenster wird erst sichtbar, nachdem Daten geladen wurden
				fenster.setVisible(true);
			}		
		};
		worker.execute();	
	}
}


Ich möchte den Dialog erst anzeigen, nachdem Daten geladen wurden. Wie soll ich das anders (-> schöner/besser) machen, als mit dem setVisible im Konstruktor im Bsp.? (Bezogen auf das setVisible in der Klasse 'FensterInnen')
 
Zuletzt bearbeitet:

H4rr1s

Mitglied
Eine Empfehlung von mir ist das Buch "Clean Code" hat mir weitergeholfen. Ansonsten immer mit Verstand bei der Sache sein und vor einer größeren Umstrukturierung und Verbesserung nie zurückscheuen.

Grüße
H4rr1s
 

DaveIT

Mitglied
Ich möchte den Dialog erst anzeigen, nachdem Daten geladen wurden. Wie soll ich das anders (-> schöner/besser) machen, als mit dem setVisible im Konstruktor im Bsp.? (Bezogen auf das setVisible in der Klasse 'FensterInnen')

Du kannst eine Variable nehmen die nach dem Laden "true" wird
Code:
private boolean dataReady = false;
public boolean dataReady(){
  return dataReady;
}

In der aufrufenden Klasse fragst du dann ab ob die Daten bereit sind und rufst setVisible(); auf.

Auch bei Hauptfenstern würde ich das setVisible nur über die Methode
Code:
public static void main(String args[])
aufrufen.

LG
 

Jens81

Gesperrter Benutzer
In der Hauptklasse in der main das setVisible zu setzen ist klar.

Aber mir ging es um das innere Fenster:
Wenn ich da mit einem boolean arbeiten würde, der true wird sobald die Daten geladen sind, müsste ich ja in der aufrufenden Klasse einen extra Thread starten, der alle x Millisekunden nachschaut, ob der boolean jetzt true ist... um dann setVisible aufzurufen - das erscheint mir doch sehr unschön und aufwändig
 
J

J7Dev

Gast
In dem du das alles im Konstruktor erledigst und dann von außen setVisible() callst.

Würde dann so aussehen das du die notwendigen Variablen als Instanz-Variable deklarierst (womit final bei einige stellen wegfällt) und dann im Konstruktor die ganze Daten lädst. Von außen callst du dann sowas wie "nuMachMaSichtbar()" und in der wird dann geprüft ob das Flag, das anzeigt das alle Daten geladen wurden, true ist und macht dann die Component sichtbar. So lange das Flag noch false liefert kannst du es in einem Loop mit Thread.sleep() packen und so warten. Ist zwar auch nicht schön und dürfte bestimmt den EDT blocken, wäre aber eine bessere Variante.
Noch besser wäre es wenn du die Klasse gleich in main() laden würdest damit schon mal alles fertig geladen ist bis zu dem Punkt wo du es darstellen willst.

Deine Frage verstehe ich schon : wie auf das Laden von Daten warten ? Antwort : mit nem Loop, nem Flag und Thread.sleep() ... oder mit nem extra Thread.
 

DaveIT

Mitglied
Einen Thread brauchst du sowieso. Und ein SwingWorker ohne sichtbare GUI macht auch wenig Sinn. Swing Worker in die aufrufende Klasse packen und vlt noch einen Ladebalken realisieren damit der Benutzer nicht ungeduldig wird?

Woher holst du denn die Daten?

LG
 

Marco13

Top Contributor
Hä...? Einen Moment lang war ich auch verwirrt, aber .... (*Morgenkaffee schlürf*) Es geht um einen Background-Task, der in einem anderen Thread abläuft, und wenn der fertig ist, soll ein Dialog aufpoppen? (Üblicherweise ist es genau umgekehrt, und in dem Dialog ist meistens die ProgressBar zu sehen...) ... aber... WENN das so sein soll, wäre sein SwingWorker OK, aber der muss/sollte IMHO nicht vom "Inneren Fenster" (also NICHT vom Dialog) verwaltet werden...
 

Jens81

Gesperrter Benutzer
Der Morgenkaffee ist aber schon kalt... :)

Der Dialog soll sich seine benötigten Daten aus einer DB laden. Da es sehr viele Dialoge gibt, habe ich die Logik zum jeweiligen Laden der Daten in die "Inneren Fenster" ausgelagert.

Ich Haupfenster erstelle ich also nur noch den benötigen Dialog mit new, der lädt dann seinen Kram und zeigt sich an, sobald er fertig ist. Eine ProgressBar wird nicht benötigt.
 

Crian

Top Contributor
Bei sowas habe ich in einer Anwendung erst eine Art Splashscreen mit Informationen über den Fortschritt als Balken sowie in einem Textfeld gebaut und erst wenn alles geladen ist, starte ich die eigentliche Gui.
 

DaveIT

Mitglied
Der Dialog soll sich seine benötigten Daten aus einer DB laden. Da es sehr viele Dialoge gibt, habe ich die Logik zum jeweiligen Laden der Daten in die "Inneren Fenster" ausgelagert.

Ein SwingWorker macht bei einem Dialog der erst nach dem Laden der Daten angezeigt wird dann aber eher wenig Sinn.

Ich Haupfenster erstelle ich also nur noch den benötigen Dialog mit new, der lädt dann seinen Kram und zeigt sich an, sobald er fertig ist. Eine ProgressBar wird nicht benötigt.

Wenn du das "setVisible()" nicht im Konstruktor aufrufen und nur ein Objekt erzeugen willst könntest du eine Klasse schreiben die genau das erledigt.

Eine ProgressBar oder ähnliches als Rückmeldung für den Nutzer zahlt sich meiner Meinung nach eigentlich immer aus damit der Benutzer sieht das sich etwas tut.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Lukasbsc Wie kann ich meinen Code optimieren? Java Basics - Anfänger-Themen 4
S Bewertet meinen Code - Part 1 Java Basics - Anfänger-Themen 8
N Ich weiß nicht, wie ich meinen Code richtig designen soll und komme nicht weiter Java Basics - Anfänger-Themen 4
E Input/Output Kann jemand meinen Code durchschauen? Java Basics - Anfänger-Themen 4
I SwingUtilities.invokeLater - Wie verwenden für meinen Code? Java Basics - Anfänger-Themen 4
J problem (kann meinen Code nicht kompilieren) Java Basics - Anfänger-Themen 3
B bitte mal meinen adressbuch-code checken Java Basics - Anfänger-Themen 14
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G Bitte meinen Account löschen Java Basics - Anfänger-Themen 1
W Verschachtelte If-else --> finde meinen Fehler nicht Java Basics - Anfänger-Themen 30
R Ich sehe meinen fehler nicht Java Basics - Anfänger-Themen 8
F Methoden Bitte Helft mir meinen Fehler zu finden. Möchte in diesem Bankenprogramm durch die Konsoleneingabe auswählen welches Konto reduziert und welches erhö Java Basics - Anfänger-Themen 17
A Kalender programmieren, ich finde meinen Fehler nicht. Java Basics - Anfänger-Themen 9
R Erste Schritte Verkettete Liste will einfach nicht in meinen Schädel Java Basics - Anfänger-Themen 11
S OOP Sachen aus meinen getMethoden ausgeben lassen `??? Java Basics - Anfänger-Themen 3
E Input/Output Konsole erkennt meinen Buchstaben nicht Java Basics - Anfänger-Themen 12
H Input/Output ImageIO.load frisst meinen ganzen Speicher weg! Java Basics - Anfänger-Themen 4
T Erste Schritte Fragen zu meinen kleinen Programm Java Basics - Anfänger-Themen 9
P Bekomme in meinen JPanel nur eine JComponente angezeigt Java Basics - Anfänger-Themen 7
S Hilfe es frisst meinen RAM! Java Basics - Anfänger-Themen 5
V finde meinen Fehler nicht Java Basics - Anfänger-Themen 10
V Ganz kurze Java-Hilfe - Ich finde meinen Fehler nicht Java Basics - Anfänger-Themen 4
C Reference - wird gegen meinen Willen - auf null gesetzt Java Basics - Anfänger-Themen 2
C Finde meinen Fehler nicht Java Basics - Anfänger-Themen 6
C wie bekomm ich ein animiertes .gif bild in meinen JPanel Java Basics - Anfänger-Themen 2
G Wie finde ich das Verzeichnis von meinen Java Projekt? Java Basics - Anfänger-Themen 7
J Wie installiere ich die api index.html in meinen java editor Java Basics - Anfänger-Themen 4
R Finde meinen Fehler nicht! - Namen von Personen vergleichen Java Basics - Anfänger-Themen 6
P meine java applets laufen nicht bei meinen freunden Java Basics - Anfänger-Themen 5
M Code aus IntelliJ in "Textform" für Word-Paper? Java Basics - Anfänger-Themen 10
T Kann mir jemand wörtlich erklären, was in dem Code genau passiert? Java Basics - Anfänger-Themen 1
Ü Dead Code im Programm? Java Basics - Anfänger-Themen 13
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
terashy VS Code Project run error Java Basics - Anfänger-Themen 10
JaZuDemNo Code Erklärung Java Basics - Anfänger-Themen 3
M Connect-4-Code analysieren Java Basics - Anfänger-Themen 2
N BMI Rechner Was haltet ihr von dem Code habt ihr Verbesserungsvorschläge weil design teschnisch ist das nicht das geilste würde das gerne überarbeiten Java Basics - Anfänger-Themen 12
W In alten Code zurück- und dort wieder zurechtfinden? Java Basics - Anfänger-Themen 17
T code so schreiben das er von sich selber anpasst (code soll die anzahl aller bustaben bestimmen) Java Basics - Anfänger-Themen 16
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
T Fehlercode bei code der das Alter ausrechnet Java Basics - Anfänger-Themen 2
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
jhfjeh Strukturgramm in code Java Basics - Anfänger-Themen 11
D Tipps zum Code Java Basics - Anfänger-Themen 24
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
W Java-code Java Basics - Anfänger-Themen 8
W Java-code Java Basics - Anfänger-Themen 9
W Java-Code erklären Java Basics - Anfänger-Themen 6
ohneInformatik; For Schleife. Was macht dieser Code?? Java Basics - Anfänger-Themen 5
Say Fehlenden Code finden in einer while-Schleife? Java Basics - Anfänger-Themen 11
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
Say Stelle in Code herausfinden, wie geht man vor? Java Basics - Anfänger-Themen 12
Say do-While Code Ausführung Java Basics - Anfänger-Themen 3
W Rückfrage zur Programmgestaltung (clean code) Java Basics - Anfänger-Themen 12
M intelliJ auf neuem PC, plötzlich kein Code Java Basics - Anfänger-Themen 3
Pinhg Sound in Greenfoot Code einbinden Java Basics - Anfänger-Themen 2
C Java boolean Code läuft nicht Java Basics - Anfänger-Themen 5
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
J Größter gemeinsamer Teiler: mein Code Java Basics - Anfänger-Themen 6
B Den Dateipfad einer Java Datei durch Code in Selbiger finden? Java Basics - Anfänger-Themen 10
A Wie könnte man diesen Code kürzer machen ? Java Basics - Anfänger-Themen 7
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
S Hilfe bei Umänderung von Java Code Java Basics - Anfänger-Themen 16
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
K Wie kann man diesen Code schnell und effizient interpretieren (Man hat nur 4 Minuten) Java Basics - Anfänger-Themen 3
R ISBN-10-Code überprüfen Java Basics - Anfänger-Themen 7
I Bitte um Hilfe zu unterstehenden Code Java Basics - Anfänger-Themen 6
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
I HTML Code säubern Java Basics - Anfänger-Themen 4
B Brauche Hilfe zu einem Code Java Basics - Anfänger-Themen 5
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
N Java-Code abwärtskompatibel machen Java Basics - Anfänger-Themen 4
J Erste Schritte Was mache ich in meinem Code falsch. Java Basics - Anfänger-Themen 3
Ameise04 Variablen Inhalt einer Variable im Code verwenden? Java Basics - Anfänger-Themen 9
S Compiler-Fehler Nicht adressierbarer Code ( Non-addressable code ) Java Basics - Anfänger-Themen 5
Aemulit Java Schaltjahr berechnen Code Java Basics - Anfänger-Themen 7
A Code Problem Java Basics - Anfänger-Themen 6
C Fehler im Code Java Basics - Anfänger-Themen 10
A Zu einem bestimmten Ort im Code springen Java Basics - Anfänger-Themen 11
L Ist der Code richtig Java Basics - Anfänger-Themen 3
josfe1234 code vereinfachen Java Basics - Anfänger-Themen 15
nonickatall Ausführbarkeit von Code testen bzw. Remote Debugging Java Basics - Anfänger-Themen 4
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
S Fehler bei Code mit SubStrings für mich nicht auffindbar. Java Basics - Anfänger-Themen 4
G Programm Code Java Basics - Anfänger-Themen 5
C Code zusammenfassen Java Basics - Anfänger-Themen 5
I Erklärung zum Java Code Java Basics - Anfänger-Themen 2
T Programmablaufsplaninterpretation in Code umformen Java Basics - Anfänger-Themen 1
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
AlexVo String zu Java Anweisung getString("*** java code ***") Java Basics - Anfänger-Themen 19
M ISBN-Code Java Basics - Anfänger-Themen 26
B Zeitgleiches Arbeiten am Code mit mehreren Personen? Java Basics - Anfänger-Themen 7
S Wie kann ich bei diesem Code erreichen, das als Ergebnis hier 15 herauskommt? Java Basics - Anfänger-Themen 23
N Kann man den Code vereinfachen? Java Basics - Anfänger-Themen 25
marcooooo Code erklären Java Basics - Anfänger-Themen 28

Ähnliche Java Themen

Neue Themen


Oben