LayoutManager NullLayout überlappende Labels werden nicht angezeigt

alex_fairytail

Mitglied
Hallo Ihr!

Ich habe diesmal ein Problem mit dem NullLayout. Ich habe ja bereits die Frage gestellt wegen des Banknotenalgorithmus, der funktioniert soweit ganz gut.
Für alle dies verpasst haben: Ich wollte einen Betrag in Schweizer Banknoten aufteilen, grösste zuerst (also nicht für 500 Franken 5 Hunderter sondern 2 Zweihunderter und einen Hunderter).
Jetzt will ich das ganze in einem Fenster darstellen und zwar folgendermassen: Jede Banknote die angezeigt wird verbreitert das Fenster ein bisschen, da sie ja alle nebeneinander angezeigt werden.
Jenachdem wieviele von jeder Banknote angezeigt werden, möchte ich überlappende Labels haben.
Beispiel: bei 3100 Schweizer Franken wären das 3 Tausender und 1 Hunderter. Nun möchte ich in dem Fenster die 3 Tausender überlappend dargestellt (um 10 Pixel oder so) und daneben den Hunderter.
Das funktioniert auch fast, Tausender und Hunderter werden nebeneinander dargestellt, von den überlappenden Tausendern erscheint jedoch immer nur der Letzte (je mehr Tausender desto weiter unten, die versetzte Darstellung scheint also eigtl. auch zu klappen).

Printscreen davon ist angehängt.

Hier der Java Code der Klasse, Aufruf mittels
Java:
Geldausgabe test = new Geldausgabe(); test.ausgeben(3100);


Hier der Quelltext der Klasse:

Java:
package bancomat;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;


public class Geldausgabe {
    
        private JDialog geldFenster = new JDialog(); // Fenster initialisieren
        private JPanel geld_panel = new JPanel(); // Panel das die Geldlabels beinhaltet initialisieren
        
        private static int[] scheine = {1000, 200, 100, 50, 20, 10};
        private int[] anzScheine = new int[scheine.length];
        
        private int fensterBreiteMultiplikator = 0; // Wird verwendet, um die Grösse des Fensters der Anzahl Noten anzupassen

        // Labels für die Banknoten
        private JLabel[] templabelarray = new JLabel[6];
        private JLabel[][] displabelarray = new JLabel[6][10];

        // BufferedImages um die Banknotenbilder zu laden
        private BufferedImage[] iconarray = new BufferedImage[6];



	public void ausgeben(int betrag) {
            // Berechnen, wieviele Scheine es wovon braucht.
            anzScheine = berechneAnzGeldscheine(betrag);


            // Fenster mit GridBagLayout erstellen
            geldFenster.setDefaultCloseOperation( JFrame.HIDE_ON_CLOSE );
            geldFenster.setTitle("Geldausgabe:");
            geld_panel.setLayout( null );

            // Images aus dem Ressources Directory auslesen
            try{
                iconarray[5] = ImageIO.read(new File("ressources\\10fr.jpg"));
                iconarray[4] = ImageIO.read(new File("ressources\\20fr.jpg"));
                iconarray[3] = ImageIO.read(new File("ressources\\50fr.jpg"));
                iconarray[2] = ImageIO.read(new File("ressources\\100fr.jpg"));
                iconarray[1] = ImageIO.read(new File("ressources\\200fr.jpg"));
                iconarray[0] = ImageIO.read(new File("ressources\\1000fr.jpg"));
            }catch(IOException e){
                System.out.println("IOException while reading Bankoten-Images:");
                System.err.println(e);
            }

            for (int i = 0; i < anzScheine.length; i++) {
                if(anzScheine[i] > 0){
                    fensterBreiteMultiplikator++;
                    //labelarray[i] = new JLabel("x"+anzScheine[i]);
                    templabelarray[i] = new JLabel("");
                    templabelarray[i].setIcon( new ImageIcon(iconarray[i]));

                    for(int c = 0; c < anzScheine[i]; c++){
                        displabelarray[i][c] = templabelarray[i];
                        //addComponent(geld_panel, nl, displabelarray[i][c], i, c, 1, 1, 0.0, 0.0, 10, 10,  0, i*10+10, 0, 0);
                        displabelarray[i][c].setBounds((fensterBreiteMultiplikator-1)*210+c*10, 10+c*10, 150, 330 - i*15);
                        geld_panel.add(displabelarray[i][c]);
                    }
                }
            }


            

            geldFenster.add(geld_panel);
            geldFenster.setSize( fensterBreiteMultiplikator*200, 400 );
            geldFenster.setResizable(false);
            geldFenster.setVisible(true);


	}


        /**
         * Die Methode addComponent wird verwendet, um Teile eines Swing-GUIs einfacher einbinden
         * zu können. Man kann der Methode nur das Panel wo die Komponente reinkommen soll,
         * das entsprechende Layout (hier GridBag), die Komponente und die Parameter dazu über-
         * geben und dann wird es eingebunden.
         */
        void addComponent( JPanel cont,
                            GridBagLayout gbl,
                            JLabel c,
                            int x, int y,
                            int width, int height,
                            double weightx, double weighty,
                            int argipadx, int argipady,
                            //int arganchor,
                            int topinset,
                            int leftinset,
                            int bottominset,
                            int rightinset)
        {
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = x; gbc.gridy = y;
            gbc.gridwidth = width; gbc.gridheight = height;
            gbc.weightx = weightx; gbc.weighty = weighty;
            gbc.ipadx = argipadx; gbc.ipady = argipady;
            //gbc.anchor = arganchor;
            gbc.insets = new Insets(topinset ,leftinset,bottominset,rightinset);
            gbl.setConstraints( c, gbc );
            cont.add( c );
        }


        /**
         * Die Methode geldscheine gibt einem von einem
         * übergebenen Betrag die Aufteilung in Geldscheine
         * als integer Array zurück (Stelle 0 = 1000er,
         * Stelle 1 = 200er usw.).
         * Diese Logik wurde der Übersicht halber in eine Methode
         * ausgeklammert, nicht weil sie mehrfach verwendet wird.
         */
        private int[] berechneAnzGeldscheine(int betrag){
                int[] anzahl = new int[scheine.length];
                while(betrag!=0){

                    for(int i=0; i < scheine.length; i++){
                        if(scheine[i] <= betrag){
                            anzahl[i]++;
                            betrag-=scheine[i];
                            i--;
                        }

                    }
                }
		return anzahl;
		
	}
}
 

Anhänge

  • bla.JPG
    bla.JPG
    30,3 KB · Aufrufe: 29
Java:
if(anzScheine[i] > 0){
	templabelarray[i] = new JLabel(new ImageIcon(iconarray[i]));
	for(int c = 0; c < anzScheine[i]; c++){
		displabelarray[i][c] = templabelarray[i];
		displabelarray[i][c].setBounds((fensterBreiteMultiplikator-1)*210+c*10, 10+c*10, 150, 330 - i*15);
		geld_panel.add(displabelarray[i][c]);
	}
}

Du verwendest ja für jeden Geldschein das selbe Label. 😱
btw. kriegt man von den Geld keine Alpträume? :shock:
 
Java:
if(anzScheine[i] > 0){
	templabelarray[i] = new JLabel(new ImageIcon(iconarray[i]));
	for(int c = 0; c < anzScheine[i]; c++){
		displabelarray[i][c] = templabelarray[i];
		displabelarray[i][c].setBounds((fensterBreiteMultiplikator-1)*210+c*10, 10+c*10, 150, 330 - i*15);
		geld_panel.add(displabelarray[i][c]);
	}
}

Du verwendest ja für jeden Geldschein das selbe Label. 😱
btw. kriegt man von den Geld keine Alpträume? :shock:

Ne das geht 😉 auch wenn ichs daneben finde einen Hitler-Sympathisanten auf die 10er Note zu drucken...

Wieso meinst du dasselbe Label? displabelarray[c] ändert sich ja bei jedem Durchlauf der innersten for-Schleife, c wird immer um eins hochgezählt, dann ist das doch ein neues label? ???:L

Edit: habs gesehen. So gehts:

Java:
            for (int i = 0; i < anzScheine.length; i++) {
                if(anzScheine[i] > 0){
                    fensterBreiteMultiplikator++;
                    //labelarray[i] = new JLabel("x"+anzScheine[i]);
                    //templabelarray[i] = new JLabel("");
                    //templabelarray[i].setIcon( new ImageIcon(iconarray[i]));

                    for(int c = anzScheine[i]; c > 0 ; c--){
                        displabelarray[i][c] = new JLabel("");
                        displabelarray[i][c].setIcon( new ImageIcon(iconarray[i]));
                        //addComponent(geld_panel, nl, displabelarray[i][c], i, c, 1, 1, 0.0, 0.0, 10, 10,  0, i*10+10, 0, 0);
                        displabelarray[i][c].setBounds((fensterBreiteMultiplikator-1)*210-c*10, 10-c*10, 150, 330 - i*15);
                        geld_panel.add(displabelarray[i][c]);

                    }
                }
            }

DankeDankeDankeDankeDanke 🙂
 
Zuletzt bearbeitet:
Das würde für die anderen Scheinarten genauso wenig funktioneren, wenn man mehr als einen Schein hat. Da Du pro Scheinart immer das selbe Label nutzt und immer weiter nach unten verscheibst.

Ich würde die Bilder einfach nur zeichnen, statt mit Labels und Co zu arbeiten.
 
Das würde für die anderen Scheinarten genauso wenig funktioneren, wenn man mehr als einen Schein hat. Da Du pro Scheinart immer das selbe Label nutzt und immer weiter nach unten verscheibst.

Ich würde die Bilder einfach nur zeichnen, statt mit Labels und Co zu arbeiten.

Ne geht schon, wie ichs gemacht habe kannst du ja oben lesen, so funktionierts nicht schlecht und da das Fenster eh statisch ist ist es ok 🙂

danke vielmals!!

[/closed]
 

Neue Themen


Zurück
Oben