Initialisieren von Fenstern über Methoden

Fabulus

Mitglied
Hallo Freunde!

Ich habe eine Klasse "Window", deren Instanzen, wie der Name sagt, Fenster sind. Da ich aber nicht für jedes Panel und Label den Kommando in den Konstruktor schreiben möchte, habe ich gedacht, ich schreibe eine Methode "create_entry", die die Panels und Labels uebergeben bekommt.
Um leichter auf diese zuzugreifen, speicher ich sie in einem Array. Mein Problem ist jetzt, dass ich die Methode create_entry im Konstruktor aufrufe, dort werden die Attribute initialisiert und im Konstruktor das soeben erstellte Panel im main-Frame packen will. Hierbei kommt aber eine NullPointerException. Ich habe die Vermutung, dass das daran liegt, dass die Panels und labels nur Methodenintern initialisiert werden, sprich, außerhalb der Methode nicht genutzt werden können. Wie kann ich das verhindern?

Hier mein Code:
Java:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Window extends JFrame implements ActionListener {


	private static final long serialVersionUID = 1L;
	protected JFrame main;
	protected String title;
	protected JLabel[] label;
	protected JLabel[] dots;
	protected JTextField[] text;
	protected JPanel[] panel;

	
	
	public Window(String t, int labels, int panels, int dot, int nr_text) {
		title=t;
		
		/*
		 * Initialize Window-Properties
		 */
		main=new JFrame(t);
		this.label=new JLabel[labels];
		this.dots=new JLabel[dot];
		this.text=new JTextField[nr_text];
		this.panel=new JPanel[panels];
		
		/*
		 * Initialize Entries
		 */
		create_entry(label[0], "Beginn: ", text[0], dots[0], text[1], panel[0]); // begin entry
		
		main.add(panel[0]);
		main.pack();
		main.setVisible(true);
	}
	
	/* 
	 * Diese Funktionen generieren einen Zeileneintrag. 
	 * Beispiel:
	 * Beginn: XXX : XXX 
	 */
	public void create_entry(JLabel name, String entry, JTextField hours, JLabel dots, JTextField mins, JPanel p) {
	
		name=new JLabel(entry);
		hours=new JTextField(4);
		dots=new JLabel(" : ");
		mins=new JTextField(4);
		p=new JPanel();
		p.add(name);
		p.add(hours);
		p.add(dots);
		p.add(mins);
	}
	
	
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
	}
	
	public static void main(String[] args) {
		String title="Testfenster 1 ";
		Window main=new Window(title, 20, 20, 5, 14);
	}
}

Ich hoffe doch und bin mir sicher, dass ihr mir weiterhelfen könnt :)

Viele Grüße,
Jan
 

ymene

Bekanntes Mitglied
Fabulus hat gesagt.:
Ich habe die Vermutung, dass das daran liegt, dass die Panels und labels nur Methodenintern initialisiert werden, sprich, außerhalb der Methode nicht genutzt werden können. Wie kann ich das verhindern?

Deine Vermutung ist nicht richtig. Du kannst sowohl Panels als auch Labels an beliebiger Stelle initialisieren lassen. Arbeitest du mit einer IDE wie Eclipse? Da würde dir der Debugmodus vermutlich weiter helfen. Das Problem ist gerade, dass du deiner create_entry Methode mehrere null-parameter übergibst, da die Arrays nicht gefüllt sind. Dort initialisiert du zwar die Objekte, aber du packst sie zu keiner Stelle in die Arrays rein. Du definierst nur ihre Größe. Es fehlt etwas ala:

Java:
panel[ 0 ] = p;

in deiner create_entry Methode, nachdem du p initialisiert hast. Damit sollte es dann (vorläufig) funktionieren.

Allerdings bringt deine Konstruktion noch einige andere Tücken mit sich, aber die wirst du sicher schnell selber bemerken :).
 

Fabulus

Mitglied
Ach, die kleinsten Fehler übersieht man am schnellsten! Dass ich da nich selbst drauf gekommen bin, Mensch.
Danke dir :) Sofern es weitere Probleme gibt, wie du sagst (das ist momentan nur mein Grundgerüst, um zu testen, ob es überhaupt klappt), werd ich es hier schreiben.
 

Fabulus

Mitglied
Soweit so gut, ich entschuldige mich für den doppelpost, falls diese nicht erlaubt sind, aber ansonsten sieht man ja nicht die Aktualisierung, oder?

Ich bin jetzt soweit, dass das Panel mit den Labels und Entries erstellt wird, möchte diese jetzt nun mit einem GridBagLayout packen. Ist es sinnvoll, die Panels, die ich erstellt habe, mit dem GBL zu packen oder ist es sinnvoller, die einzelnen Komponenten des Panels in das GBL zu packen?

Für das Packen mit dem GBL habe ich mir eine Methode addComponents geschrieben. In der Main-Methode werden die Panels erstellt und in das GBL hinzugefügt. Leider werden sie aber nicht beim Programmstart angezeigt. Mein Code sieht folgendermaßen aus:

Java:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Window extends JFrame implements ActionListener {


    private static final long serialVersionUID = 1L;
    protected JFrame main;
    protected String title;
    
    protected JLabel[] label;
    protected JLabel[] dots;

    protected GridBagLayout gbl;
    
    protected JTextField[] text;

    protected JPanel[] panel;

    
    
    public Window(String t, int labels, int panels, int dot, int nr_text, boolean createMenu, int sizeX, int sizeY) {
        
        /*
         * Initialize Window-Properties
         */
        title=t;
        main=new JFrame(t);
        main.setDefaultCloseOperation(EXIT_ON_CLOSE);
        main.setSize(sizeX,sizeY);
        

        gbl=new GridBagLayout();
        main.getContentPane().setLayout(gbl);

        
        this.label=new JLabel[labels];
        this.dots=new JLabel[dot];
        this.text=new JTextField[nr_text];
        this.panel=new JPanel[panels];
        
    }
    

    /* 
     * Diese Funktionen generieren einen Zeileneintrag. 
     * Beispiel:
     * Beginn: XXX : XXX 
     */
    public void createEntry(int index_label, String entry, int index_text,int index_text2, int index_dots, 
             int index_panel) {

        label[index_label]=new JLabel(entry);
        text[index_text]=new JTextField(2);
        dots[index_dots]=new JLabel(" : ");
        text[index_text2]=new JTextField(2);
        panel[index_panel]=new JPanel();
        panel[index_panel].add(label[index_label]);
        panel[index_panel].add(text[index_text]);
        panel[index_panel].add(dots[index_dots]);
        panel[index_panel].add(text[index_text2]);
    }
    
    
    public void createMenubar() {
        
        // noch zu erstellen
    }
    
    public void addComponent(    Container cont,
                                GridBagLayout gbl,
                                Component c,
                                int x, int y,
                                int width, int height,
                                double weightx, double weighty) {
        
        GridBagConstraints gbc = new GridBagConstraints(); 
        gbc.fill = GridBagConstraints.BOTH; 
        gbc.gridx = x; gbc.gridy = y; 
        gbc.gridwidth = width; gbc.gridheight = height; 
        gbc.weightx = weightx; gbc.weighty = weighty; 
        gbl.setConstraints( c, gbc ); 
        cont.add( c ); 
        
    }
    
    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub
        
    }

}


und die Main Klasse sieht so aus:

Java:
public class Main {

    public static void main(String[] args) {
        String title=""Testprogramm;
        Window main=new Window(title, 20, 20, 20, 14, true, 600,600);
        /*
         * Initialize main-Entries
         * createEntry(index_label, entry, index_text, index_text2, index_dots, index_panel)
         */
        main.createEntry(0, "Label 0", 0, 1, 0, 0); 
        main.createEntry(1, "Label1", 2, 3, 1, 1);
        main.createEntry2(2, 4, "Label 2", 4, 2, " h"); 
        main.createEntry2(3, 5, "Label 3", 5,3," h");
        
        main.createEntry(6, "Label 4", 6, 7, 2, 4);
        main.createEntry(7, "Label 5", 8, 9, 3, 5);
        main.createEntry(8, "Label 6", 10, 11, 4, 6);
        main.createEntry(9, "Label 7", 12, 13, 5, 7);
        
        main.addComponent(main.getContentPane(), main.gbl, main.panel[0], 0, 0, 1, 1, 0.0, 0.0);
        main.addComponent(main.getContentPane(), main.gbl, main.panel[1], 0, 1, 1, 1, 0.0, 0.0);
        main.addComponent(main.getContentPane(), main.gbl, main.panel[2], 1, 0, 1, 1, 0.0, 0.0);
        main.addComponent(main.getContentPane(), main.gbl, main.panel[3], 1, 1, 1, 1, 0.0, 0.0);
        
        
        main.setVisible(true);
    }
}

Wenn ich das Programm starte, ist die Fenstergröße minimal (leider nicht 600x600), und es ist nur das Panel zu sehen, welches "Label 7" und das dazugehörige Textfeld beinhaltet.

Was mach ich denn falsch?
Die createEntry-Methode sieht so ähnlich aus wie die erste, deshalb habe ich sie weggelassen :)
Achja, die AddComponents-Methode habe ich von "Java ist auch eine Insel" von Galileo Computings.




EDIT: Habe meinen Fehler gefunden. Ich sollte natürlich statt
[Java]main.setVisible(true);[/code]
Java:
main.main.setvisible(true);
schreiben. Da war wohl die Namensgebung etwas unglücklich.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
MouseEvent richtig initialisieren AWT, Swing, JavaFX & SWT 1
R AWT Graphics initialisieren AWT, Swing, JavaFX & SWT 15
G Anonyme Instanz von JXImageView erstellen und mit Bild initialisieren AWT, Swing, JavaFX & SWT 7
N JTable, AbstractTableModel aus Datenbank initialisieren AWT, Swing, JavaFX & SWT 8
B ProgressMonitor funktioniert nur beim Initialisieren AWT, Swing, JavaFX & SWT 3
K Applet Wieso kann ich keine Array im Applet initialisieren AWT, Swing, JavaFX & SWT 13
X jTextFields dynamisch initialisieren AWT, Swing, JavaFX & SWT 2
G Swing JTable Header neu initialisieren? AWT, Swing, JavaFX & SWT 2
G kleine Frage beim initialisieren AWT, Swing, JavaFX & SWT 2
V Fenster im Vollbildmodus initialisieren . AWT, Swing, JavaFX & SWT 9
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
F Menüs in allen Fenstern anzeigen AWT, Swing, JavaFX & SWT 12
F Swing JAVA GUI Übergabe von Werten zwischen mehreren Fenstern/Klassen AWT, Swing, JavaFX & SWT 10
B Kommunikation zwischen zwei Fenstern und vorübergehende Speicherung der Eingaben AWT, Swing, JavaFX & SWT 4
L Zeichnen in zwei Fenstern AWT, Swing, JavaFX & SWT 8
JStickman SWT Problem mit Fenstern AWT, Swing, JavaFX & SWT 7
U MVC: Rolle vom MainController zu Fenstern, Unterfenster u. Listenern AWT, Swing, JavaFX & SWT 8
I Arbeiten mit mehreren Fenstern AWT, Swing, JavaFX & SWT 4
X Wie passt JIternalFrame sich den anderen Fenstern an? AWT, Swing, JavaFX & SWT 3
Herr.Jth Frage zu inaktiven Fenstern AWT, Swing, JavaFX & SWT 7
M Hintergrundgrafik in Swing-Fenstern AWT, Swing, JavaFX & SWT 11
R Navigieren zwischen mehreren Fenstern AWT, Swing, JavaFX & SWT 7
C Probleme beim ausführen von Programmen mit Fenstern+Inhalt AWT, Swing, JavaFX & SWT 3
U Anwendung mit mehreren "Fenstern" AWT, Swing, JavaFX & SWT 4
H Problem mit Layout Fenstern (Swing) AWT, Swing, JavaFX & SWT 3
L GUI - 2 Buttons mit 2 Fenstern verlinken AWT, Swing, JavaFX & SWT 4
O Applikation mit unterschiedlichen Fenstern AWT, Swing, JavaFX & SWT 4
K JFrames in verschiedenen Fenstern AWT, Swing, JavaFX & SWT 2
I JTextfield senden über Enter AWT, Swing, JavaFX & SWT 1
T Scene wechseln über ManuItem AWT, Swing, JavaFX & SWT 7
I JavaFX - Pane wechseln über 2. Controller AWT, Swing, JavaFX & SWT 5
melaniemueller Layout wechseln über RadioButtons AWT, Swing, JavaFX & SWT 4
melaniemueller Verschiebung eines Fensters über Button AWT, Swing, JavaFX & SWT 27
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
A Layoutwechsel über RadioButtons AWT, Swing, JavaFX & SWT 3
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
missy72 JavaFX Performance / ImageView in TableView über TimeLine AWT, Swing, JavaFX & SWT 1
T TableView über Methode befüllen AWT, Swing, JavaFX & SWT 10
J Spielfelder auch über die Tastatureingabe (1…9) ansteuern (Tic Tac Toe) AWT, Swing, JavaFX & SWT 2
M Eine Datei auf den Apache Server hochladen - über das Menü im JavaProgramm AWT, Swing, JavaFX & SWT 7
C Swing Aufruf der Funktion (die ein Dialog anzeigt) über Symbol anzeigen lassen AWT, Swing, JavaFX & SWT 4
G LayoutManager Panels anordnen über Schleifenvariablen AWT, Swing, JavaFX & SWT 7
F Verzeichnis über GUI erstellen AWT, Swing, JavaFX & SWT 2
T GUI über Tastatur bedienen AWT, Swing, JavaFX & SWT 3
OSchriever Layout über Radiobuttons ändern AWT, Swing, JavaFX & SWT 4
L JavaFX TreeView Edit Mode über F2 AWT, Swing, JavaFX & SWT 13
J Schriftart über einen Button ändern AWT, Swing, JavaFX & SWT 1
CptK Swing DropdownMenu über Panel-Grenzen hinaus anzeigen AWT, Swing, JavaFX & SWT 1
A 2D-Grafik Zeichen werden über unabhängingen JRadioButton nicht gefüllt AWT, Swing, JavaFX & SWT 28
S JavaFX Fenster aufkommen lassen, wenn mit der Maus über bestimmten Bereich fahren AWT, Swing, JavaFX & SWT 1
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
C JavaFX ScrollPane schießt über das Ziel hinaus... AWT, Swing, JavaFX & SWT 1
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
R Ausgabe über JOptionPane.showMessageDialog funktioniert nicht AWT, Swing, JavaFX & SWT 2
L JavaFX button über andere Klasse ändern AWT, Swing, JavaFX & SWT 7
K über Button andere Java Klasse aufrufen AWT, Swing, JavaFX & SWT 15
T .jar-Datei lässt sich unflexibler ausführen als über die IDE AWT, Swing, JavaFX & SWT 11
C Applet Zeichnen über Button-Click AWT, Swing, JavaFX & SWT 13
L JavaFX Hover Effekt über das Parent Element AWT, Swing, JavaFX & SWT 4
C JavaFX GUI - Entscheidung über Framework AWT, Swing, JavaFX & SWT 4
A Swing Gemaltes Bild über saveDialog speichern unter AWT, Swing, JavaFX & SWT 15
L Dynamischer Aufbau einer Tabelle über Objekte AWT, Swing, JavaFX & SWT 2
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
S AWT Daten über TextField und Button in array speichern AWT, Swing, JavaFX & SWT 5
T Klasse über JButton schließen AWT, Swing, JavaFX & SWT 4
Augenblau JavaFX Externe Schriftart über CSS ansprechen und zuweisen AWT, Swing, JavaFX & SWT 5
T Generische Klasse in JList über DefaultListModel AWT, Swing, JavaFX & SWT 1
Z JAVAFX Stage über Controller weitergeben um css-file zu laden AWT, Swing, JavaFX & SWT 4
Z Absolutes Layout / Kontrolle über Anordnung AWT, Swing, JavaFX & SWT 3
wolfgang63 JavaFX Zugriff auf Guiobjekte die über FXML erstellt wurden AWT, Swing, JavaFX & SWT 2
O JTextfield wird über'drawed'.. AWT, Swing, JavaFX & SWT 6
K JavaFX Fenster aufrufen über Menü AWT, Swing, JavaFX & SWT 1
J JTable aktuallisieren über anderen Frame AWT, Swing, JavaFX & SWT 6
kaoZ Swing JFrame lässt sich nicht über dispose() abbauen AWT, Swing, JavaFX & SWT 0
P Vorteile von Tooltip nutzen (wird über allen anderen Objekten angezeigt) AWT, Swing, JavaFX & SWT 3
elischa JFrame über mehrere JPanel und Listener AWT, Swing, JavaFX & SWT 17
B Swing Borderlayout East über North AWT, Swing, JavaFX & SWT 5
D Swing Letzte Zeile einer JTable nicht über RowSorter sotieren AWT, Swing, JavaFX & SWT 2
C Methode über Buttonklick starten AWT, Swing, JavaFX & SWT 8
P Swing Panel-austausch über einen MenuListener AWT, Swing, JavaFX & SWT 2
M JLabel über JButtons zeichnen AWT, Swing, JavaFX & SWT 4
P Swing Button über gesamtes Panel AWT, Swing, JavaFX & SWT 2
3 JDialog über einem Vollbildfenster anzeigen AWT, Swing, JavaFX & SWT 5
K GUI Elemente über eine separate Textdatei beschriften? AWT, Swing, JavaFX & SWT 4
A Bild über Imageviewer auf GUI anzeigen AWT, Swing, JavaFX & SWT 3
K 2D-Grafik Kontrastanpassung über einen JSlider AWT, Swing, JavaFX & SWT 2
G JScrollPane über JScrollPane AWT, Swing, JavaFX & SWT 2
L Button über/auf JTextField AWT, Swing, JavaFX & SWT 5
A Swing JTable wird nicht über zurückegebene Referenz geaddet.Wieso nicht? AWT, Swing, JavaFX & SWT 5
D JTextField über ein Game AWT, Swing, JavaFX & SWT 11
K Action Listener implementieren über Objekt AWT, Swing, JavaFX & SWT 14
bluerob Fehler bei Wertübermittlung über KeyListener AWT, Swing, JavaFX & SWT 3
R JTextField mit abgerundeten Ecken - Geht über Grenze hinaus AWT, Swing, JavaFX & SWT 4
S JDialog direkt über dem MainFrame aufpoppen lassen AWT, Swing, JavaFX & SWT 2
X Swing Panel Extra Klasse & Aufruf über Button AWT, Swing, JavaFX & SWT 18
J Frame mit Button erstellen - Warum ist es nötig, Frame über Unterklasse zu erstellen? (Reg Listener) AWT, Swing, JavaFX & SWT 2
P versch. JPanel Klassen über Menü öffnen AWT, Swing, JavaFX & SWT 12

Ähnliche Java Themen

Neue Themen


Oben