Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

1

20.11.2011, 16:22

[Java] Problem bei der Anzeige des "Custom Controls"

Hallo,

ich programmiere gerade ein kleines Mastermind, habe jedoch ein Problem bei der Anzeige meines kleinen Controls.

Der Code des Controls:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package Controls;
import javax.swing.JPanel;
import Logic.*;
import java.awt.Graphics;
import javax.swing.ImageIcon;
public class GuessControl extends JPanel {
    
    //Variablen
    private int _PinCount;
    private Guess _guess;
    
    //Konstruktor
    public GuessControl(Guess guess)
    {
        //Variablen setzen
        _PinCount = guess.Pins().length;
        _guess = guess;
    }
    
    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        //Pins zeichnen
        for (int i = 0; i < _PinCount; i++)
        {
            g.drawImage(new ImageIcon(getClass().getResource("images/" + _guess.Pins()[i].getColor() + ".png")).getImage(), i * 64, 0, 64, 64, this);
        }
    }   
}


Einfügen tue ich das folgendermaßen:

Quellcode

1
2
3
4
5
                                GuessControl gc = new GuessControl(gue);
                                gc.setBounds(0, 0, 250, 75);
                                gc.setLocation(0, 0);
                                gc.setVisible(true);
                                Background.add(gc);


Background ist ein JLabel mit einem Bild, das normale Fenster ein JFrame. Wenn ich also statt Background,add(gc) this.add(gc) mache, bringt das auch keine Änderung. Ich bekomme keine Fehlermeldung sondern das Control wird einfach nicht angezeigt.

Layoutmanager ist auf null gesetzt. Ich habe ebenfalls schon mit den Indices rumprobiert, also beispielsweise this.add(gc, 1), dass er es an der bestimmten Position einfügen soll, keine Änderung. Ich quäl mich erst seit ein paar Tagen mit Java rum, habe ich was vergessen?

MfG Sascha

EcaFaYn!

Frischling

Beiträge: 62

Wohnort: NRW

Beruf: Azubi + Student

  • Private Nachricht senden

2

20.11.2011, 16:59

Ruf das Sichtbar machen, also
gc.setVisible(true);
mal nach dem Hinzufuegen von gc auf - setVisible gehört immer ans Ende der Initialisierungsmethode.
Alternativ kannst du auch die Methode validate() aufrufen, nachdem du neue Elemente hinzugefügt hast.
Werden neue Elemente hinzugefügt, musst du dem Fenster/Panel immer mitteilen, dass es neu gezeichnet werden muss, z.B. über validate.
On the grind - Supersci

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

3

20.11.2011, 17:13

Ruf das Sichtbar machen, also
gc.setVisible(true);
mal nach dem Hinzufuegen von gc auf - setVisible gehört immer ans Ende der Initialisierungsmethode.
Alternativ kannst du auch die Methode validate() aufrufen, nachdem du neue Elemente hinzugefügt hast.
Werden neue Elemente hinzugefügt, musst du dem Fenster/Panel immer mitteilen, dass es neu gezeichnet werden muss, z.B. über validate.
Danke für die Antwort, aber leider keine Änderung. Es wird auch nichtmal ein Rahmen ohne Elemente oder so angezeigt, nichts, totaler Käse.

EcaFaYn!

Frischling

Beiträge: 62

Wohnort: NRW

Beruf: Azubi + Student

  • Private Nachricht senden

4

20.11.2011, 17:30

Ich hab mir deine Beschreibung nochmal näher angeguckt.

Background ist also ein JLabel? Und du versuchst nun, dem JLabel ein JPanel hinzuzufügen? Ein JLabel ist kein Container. Man kann einem JLabel keine anderen Gui-Elemente wie JPanels hinzufügen.
Bau mal ein Testpanel, setz das Layout auf FlowLayout oder GridLayout und füge diesem Panel dein GuessControl hinzu. Siehst du dann etwas? (Verpass deinem GuessControl am Besten noch einen Rahmen, dann sieht man den Rand leichter.)

EDIT: natürlich musst du dieses Testpanel dann auch dem JFrame hinzufügen.

Generell gilt, wenn nichts angezeigt wird:
- Überprüfen, ob jedes Element seine jeweiligen Unterelemente - also Elemente, die auf diesem angezeigt werden sollen - auch hinzufügt - So auch der Frame, wobei man ja meist eher mit dem ContentPanel arbeitet (also dieses die weiteren Elemente hinzufügen lässt).
- Das Layout überprüfen - generell sind diese Layoutmanager dazu da, dass Koordinaten nicht mehr von Hand eingegeben werden müssen. Ich weiß, dass das manchmal aber notwendig ist, wenn man eigene Elemente zeichnen will. Trotzdem vielleicht zu Testzwecken mal ändern.
On the grind - Supersci

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

5

20.11.2011, 18:20

In der selben Methode habe ich jetzt gleichzeitig einen neuen Frame erzeugt und diesem das Control hinzugefügt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
protected void paintComponent(Graphics g) 
{ 
super.paintComponent(g); 
//Pins zeichnen 
for (int i = 0; i < _PinCount; i++) 
{ 
g.drawImage(new ImageIcon(getClass().getResource("images/2.png")).getImage(), i * 64, 0, 64, 64, this); 
} 
}


Ergibt ne NullPointerException bei

C-/C++-Quelltext

1
2
3
public ImageIcon (URL location) { 
this(location, location.toExternalForm()); 
}


bzw. halt bei

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
@Override 
protected void paintComponent(Graphics g) 
{ 
super.paintComponent(g); 
//Pins zeichnen 
for (int i = 0; i < _PinCount; i++) 
{ 
g.drawImage(new ImageIcon(getClass().getResource("images/2.png")).getImage(), i * 64, 0, 64, 64, this); 
} 
}


edit: Der Text für den neuen Frame:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
                                GuessControl gc = new GuessControl(gue);
                                gc.setBounds(0, 0, 250, 75);
                                gc.setLocation(20, 20);
                                
                                JFrame frame = new JFrame();
                                frame.setBounds(0, 0, 300, 400);
                                frame.setLocation(0, 0);
                                frame.setVisible(true);
                                frame.validate();
                                frame.add(gc);

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Affje« (20.11.2011, 18:25)


EcaFaYn!

Frischling

Beiträge: 62

Wohnort: NRW

Beruf: Azubi + Student

  • Private Nachricht senden

6

20.11.2011, 18:31

Jetzt rufst du sowohl setvisible als auch validate vor dem add-Aufruf auf ... korrigier das bitte.
Warum baust du jetzt einen neuen Frame? Poste bitte mal deine gesamte Main-Methode einschließlich Methodenkopf.
On the grind - Supersci

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

7

20.11.2011, 18:51

Jetzt rufst du sowohl setvisible als auch validate vor dem add-Aufruf auf ... korrigier das bitte.
Warum baust du jetzt einen neuen Frame? Poste bitte mal deine gesamte Main-Methode einschließlich Methodenkopf.


Keine Änderung wenn ich das setVisible() und validate() danach einbaue.

Neuen Frame hab ich gebastelt, um zu schauen, ob es an der Ebene liegt, also falsche Z Position und ich deshalb nichts sehe.

Mein Aufbau des aktuellen Fensters:

JFrame -> Jede Menge JLabels mit Bildern -> JLabel über die gesamte Fläche als Hintergrundbild.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class GameFrame extends JFrame {
    /** Creates new form GameFrame */
    public GameFrame(int pins, int colors) {
        //Variablen setzen
        _pinCount = pins;
        _colors = colors;
        
        initComponents();
        this.setLayout(null);
        
        this.setBounds(0, 0, 1000, 700);
        this.setDefaultCloseOperation(0);
        this.setLocationRelativeTo(null);
        
        //Allgemeine Variablen initialisieren
        _game = new Game(pins, colors, 12);
        //Komponenten zeichnen
        GetComponents();
    }


Das GetComponents läd die JLabels, die zwar schon vorher per IDE auf dem Frame platziert wurden, aber erst während der Runtime geladen werden.

EcaFaYn!

Frischling

Beiträge: 62

Wohnort: NRW

Beruf: Azubi + Student

  • Private Nachricht senden

8

20.11.2011, 18:54

Jetzt rufst du sowohl setvisible als auch validate vor dem add-Aufruf auf ... korrigier das bitte.
Warum baust du jetzt einen neuen Frame? Poste bitte mal deine gesamte Main-Methode einschließlich Methodenkopf.


Keine Änderung wenn ich das setVisible() und validate() danach einbaue.
Dass das die NullPointerException behebt, war auch nicht zu erwarten. Du solltest das trotzdem immer so aufbauen.
Und du hast deine Main-Methode immer noch nicht gepostet.
On the grind - Supersci

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

9

20.11.2011, 18:56

Jetzt rufst du sowohl setvisible als auch validate vor dem add-Aufruf auf ... korrigier das bitte.
Warum baust du jetzt einen neuen Frame? Poste bitte mal deine gesamte Main-Methode einschließlich Methodenkopf.


Keine Änderung wenn ich das setVisible() und validate() danach einbaue.
Dass das die NullPointerException behebt, war auch nicht zu erwarten. Du solltest das trotzdem immer so aufbauen.
Und du hast deine Main-Methode immer noch nicht gepostet.



Ich rufe ja direkt super() im Konstruktor auf, d.h. es wird wohl die der der JPanel Methode sein.

Ich hab da sbei nem anderen Control genauso gemacht, allerdings ohne Image und da hats geklappt.



Meine main des projekts:

C-/C++-Quelltext

1
2
3
4
5
 public static void main(String[] args) throws IOException {
Main main = new Main();
main.setVisible(true); 
main.setTitle("'MasterMind'");
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Affje« (20.11.2011, 19:02)


EcaFaYn!

Frischling

Beiträge: 62

Wohnort: NRW

Beruf: Azubi + Student

  • Private Nachricht senden

10

20.11.2011, 19:13

Dein Code ist ziemlich schwer verständlich.
Was hat die Klasse Main für eine Aufgabe?
Ich hab da sbei nem anderen Control genauso gemacht, allerdings ohne Image und da hats geklappt.
Bitte sei konkreter. WAS hast du genauso gemacht und WAS hat geklappt? Die NullPointerException mag im JPanel-Konstruktor entstehen, aber verursacht wird sie an irgendeiner Stelle von deinem Code (Was du über den Stacktrace verfolgen kannst).
Fügst du nun beiden JFrames dasselbe GuessControl zu (denn das darfst du natürlich nicht machen)? Genauso diese Codestellen sind die interessanten, die du hier mal posten solltest (aus der main ist es ja ausgelagert).
On the grind - Supersci

Werbeanzeige