Array von JLabel (Anfänger... seit 2 Tagen)

SagaTious

Grünschnabel
Also hallo erstma (erster Post) :)

Ich bin seit 2 Tagen dabei ein bisschen Java zu lernen (kann Delphi daher ist Java auch nicht komplettes Neuland)...
Also hab ein Taschenrechner mal zum Anfang geschrieben (der funktioniert auch schon :D) und jetz will ich noch ein zweites kleines Programm schreiben.

Dazu hab ich in dem Programm einen Array von javax.swing.JLabel erstellt..

Code:
JLabel[] zahlen = new JLabel[99];
(geht auch, da javax.swing.JLabel eingebunden ist ;))

Jetzt will ich in einer Schleife die einzelnen Labels ausrichten und mit Text füllen:

Code:
        int p = 19;
        int a = 200;
        int b = 200;
        int c = 50;
        int d = 30;
        for ( int i=0; i <= p; i++) {
            zahlen[i-1].setText(String.valueOf(i));
            b = b - 30;
            zahlen[i-1].setBounds(a, b, c, d);
        }

Soll dann in etwa so aussehen:
Code:
10
9
8
7
6
.
.
.

Also die Zahlen einfach untereinander hingeschrieben. So wie ich das allerdings jetzt versucht habe funktionierts eben nicht!
Warscheinlich ist setBounds dafür nicht die richtige Methode!? Ich hab einfach mal "zahlen[i]." hingeschrieben und in der Liste geguckt was die Methoden so machen ^^

Also wie kann ich mein Vorhaben verwirklichen? Hilfe Bitte!
 

zeja

Erfahrenes Mitglied
Also:
zahlen[i-1]
kann schonmal nicht gehen, da dein i bei 0 anfängt. Und 0-1 ist -1 und diesen Index gibts nichts in deinem Array. Du müsstest da eine ArrayIndexOutOfBoundsException bekommen.

setBounds sollte ansonsten aber die richtige Methode sein.
 

SagaTious

Grünschnabel
Das mit dem i-1 hab ich nur probeweise eingefügt, da ich mir nicht sicher war ob bei der Schleife vor dem ersten Befehl um 1 erhöht wird oder eben nach dem letzten...
Wenn ich einfach nur i einsetzte funktioniert auch nichts... Bzw. das Programm startet zwar, wenn ich allerdings auf den Button der die Labels erzeugen soll klicke, meldet das Programm folgendes:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at zauberkugel.ZauberkugelView.start(ZauberkugelView.java:306)
        at zauberkugel.ZauberkugelView.jButton1MouseClicked(ZauberkugelView.java:313)
        at zauberkugel.ZauberkugelView.access$900(ZauberkugelView.java:25)
        at zauberkugel.ZauberkugelView$5.mouseClicked(ZauberkugelView.java:139)
        at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:253)
        at java.awt.Component.processMouseEvent(Component.java:6102)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5864)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4466)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4296)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3995)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2454)
        at java.awt.Component.dispatchEvent(Component.java:4296)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:284)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
 

zeja

Erfahrenes Mitglied
NullPointerExceptions sind wirklich sehr einfach zu lesen:
In der Klasse ZauberkugelView in Zeile 306 rufst du eine Methode auf etwas auf was null ist.

Also schau mal was in Zeile 306 steht und schau warum dieses Objekt null ist.
 

SagaTious

Grünschnabel
Code:
            zahlen[i-1].setText(String.valueOf(i));
Das ist die Zeile. Also in der Schleife das Zuweisen des Textes. Allerdings hat das nichts mit der Schleife o.Ä. zu tun, denn ich hab einfach mal probiert außerhalb der Schleife nur einem, durch den Array erzeugtem, Label ein Text zuzuweisen:

Code:
zahlen[1].setText(String.valueOf(b))
Also die Variable b die vorher initialisiert wurde. Das funktioniert allerdings auchnicht. (Selber Fehler)

Ich hab grade selbst noch eine Idee bekommen: In Delphi ist es so, dass man einen Array vom Typen eines Labels erstellen kann, dann allerdings nochmal für jedes einzelne Feld den Constuctor der Komponente aufrufen muss. (Soweit ich mich erinnern kann :))
Also es existiert zwar der Array der 99 Felder hätte, allerdings bestehen die 99 Labels davon nochnicht!
Weiß aber nicht wie ich das in Java machen muss bzw. ob das in Java überhaupt notwendig ist... Der Fehler sieht ja schwer danach aus, als ob kein Label besteht dem man den Text zuweisen könnte!?
 

zeja

Erfahrenes Mitglied
Ja korrekt. Du legst nur Speicherplatz für 99 Labels an, initialisieren musst du die aber noch.

Java:
for(int i = 0; i < zahlen.length; i++){
   zahlen[i] = new JLabel();
}

Du solltest dir allerdings dringend in einem der bekannten Onlinebücher (hier in der Linksliste des Java-Forums zu finden) mal die Grundlagen von Java aneignen. Java ist zwar einfach und schnell zu lernen wenn du eh schon programmieren kannst aber ein wenig lesen kann erstmal nicht schaden.
 

SagaTious

Grünschnabel
Ich brauch ja eigentlich nur n paar kleine Programme für ein Projekt in der Schule... Leistungskurs Programmieren.

Also so wie du es gesagt hast hab ich das jetzt auch gemacht. Es erscheinen keine Fehler mehr, die Labels erscheinen jedoch auchnicht ^^ (hab nochmal ein bisschen im Internet gesucht und herausgefunden, dass man wenn man eine Form per integriertem Form Editor macht, keine dynamische Erzeugung von Komponenten möglich ist!?)
Naja 100%ig nötig war es in meinem Programm auchnicht! Hab jetzt die Labels einfach per Hand auf dem Formular erstellt.
Jetz noch eine Frage:
Zu jedem Label mit einer Zahl drin will ich ein Label mit einem Icon haben! Die Labels habe ich auchschon erzeugt und ich hab einen Array mit Icons
Code:
        Icon[] symbole = new Icon[26];
        symbole[0] = new ImageIcon("symbol1.gif");
        symbole[1] = new ImageIcon("symbol2.gif");
        symbole[2] = new ImageIcon("symbol3.gif");
        symbole[3] = new ImageIcon("symbol4.gif");
        symbole[4] = new ImageIcon("symbol5.gif");
        symbole[5] = new ImageIcon("symbol6.gif");
        symbole[6] = new ImageIcon("symbol7.gif");
        symbole[7] = new ImageIcon("symbol8.gif");
        symbole[8] = new ImageIcon("symbol9.gif");
        symbole[9] = new ImageIcon("symbol10.gif");
        symbole[10] = new ImageIcon("symbol11.gif");
        symbole[11] = new ImageIcon("symbol12.gif");
        symbole[12] = new ImageIcon("symbol13.gif");
        symbole[13] = new ImageIcon("symbol14.gif");
        symbole[14] = new ImageIcon("symbol15.gif");
        symbole[15] = new ImageIcon("symbol16.gif");
        symbole[16] = new ImageIcon("symbol17.gif");
        symbole[17] = new ImageIcon("symbol18.gif");
        symbole[18] = new ImageIcon("symbol19.gif");
        symbole[19] = new ImageIcon("symbol20.gif");
        symbole[20] = new ImageIcon("symbol21.gif");
        symbole[21] = new ImageIcon("symbol22.gif");
        symbole[22] = new ImageIcon("symbol23.gif");
        symbole[23] = new ImageIcon("symbol24.gif");
        symbole[24] = new ImageIcon("symbol25.gif");
        symbole[25] = new ImageIcon("symbol26.gif");

Die Labels haben standardmäßig den Text "0"!
Wenn ich jetzt
Code:
        jLabSymb0.setIcon(symbole[randomValueBetween(0,26)]);
        jLabSymb0.setText("");
aufrufe, ändert sich zwar der Text des Labels, jedoch wird kein Icon zugewiesen!?

(
Code:
    final static Random RANDOMIZER = new Random();
    
    public static int randomValueBetween(int minInclusive, int maxExclusive) {
        return minInclusive + RANDOMIZER.nextInt(maxExclusive - minInclusive);
    }
auch hier aus dem Forum :))

1. Wo müssen die *.gif Dateien liegen? Im selben Ordner wie die *.java Datei?
2. Sind die Methoden um die Icons zuzuweisen überhaupt richtig?

Danke im Vorraus,
SagaTious
 

zeja

Erfahrenes Mitglied
Also eigentlich geht das gut mit dem setBounds:
Java:
package de.tutorials;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;

public class Frame extends JFrame {

	public static void main(String[] args) {
		Frame frame = new Frame();

		frame.setSize(400, 400);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}

	public Frame() {
		super("Label-Test");
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		setLayout(null);
		init();
	}

	private void init() {
		int x = 5;
		int y = 5;
		int width = 100;
		int height = 20;
		for (int i = 0; i < 10; i++) {
			JLabel label = new JLabel(Integer.toString(i));
			label.setBounds(x, y += 20, width, height);
			this.add(label);
		}
	}

}

Schöner ist es aber mit Layout:
Java:
package de.tutorials;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Frame extends JFrame {

	public static void main(String[] args) {
		Frame frame = new Frame();

		frame.setSize(400, 400);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}

	public Frame() {
		super("Label-Test");
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		setLayout(new GridBagLayout());
		init();
	}

	private void init() {
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 0;

		for (int i = 0; i < 10; i++) {
			JLabel label = new JLabel(Integer.toString(i));
			gbc.gridy++;
			this.add(label, gbc);
		}
	}

}

Deine Bilder müssen im Ausführungsverzeichnis deines Programms liegen. Ansonsten sollte es dann so eigentlich funktionieren. Rufst du das denn vor einem setVisible auf oder wenn die GUI schon angezeigt wird?
 

SagaTious

Grünschnabel
Rufst du das denn vor einem setVisible auf oder wenn die GUI schon angezeigt wird?

Also die Icons sollen beim Klick auf einen Button erscheinen... Also wird die GUI bereits angezeigt! Eigentlich alles was ich in dem Programm mache geschieht auf irgendeinem Button. Die Code-Zeilen zum Formular wird ja von NetBeans erstellt und ich weiß nicht ob das so gut is wenn ich da ohne viel Ahnung in den Zeilen rumkritzel :D
 

zeja

Erfahrenes Mitglied
Dann musst du nen repaint aufrufen, damit die GUI weiß, dass sich was geändert hat und sie neu gezeichnet werden muß.
 

Neue Beiträge