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
Hier der Quelltext der Klasse:
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;
}
}