"Trikotkonfigurator"

Kackrim

Mitglied
Hallo alle miteinander,

Das Problem ist das ich gerade für ein Projekt einen Trikotkonfigurator, oder sowas ähnliches, schreibe. Im Grunde fragt dieser einfach nur die eingabe werte von Checkboxen und Choice-Menüs ab, was auch für meine Zwecke komplett ausreichen ist.

Das was nicht funktioniert ist das ich die beiden Bilder des Trikot und das darüber liegende muster nicht darstellen kann. Es sind beides png-Dateien, die in zwei übereinander liegenden Panels dargestellt werden sollen. Jedoch wenn man das teilweise transparente Muster wählt wird das Trikot komplett überdeckt. Habe auch schon versucht das Muster in einem LayeredPane darszustellen das funktioniert aber auch nicht, da dann gar nichts angezeigt wird.

Danke schonmal für alle Antworten

MfG Kackrim

PS: das Problem müsste in Zeile 113 Stecken

Das komplette Projekt mit allen Klassen und Bilddateien
konfig.rar

Java:
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;


import java.io.File;
import java.io.IOException;

import javax.swing.*;


public class Karim extends JFrame{
  
  private JPanel contentPane;
  Bild bild = new Bild();
  Mubild mubild = new Mubild();
  
  BufferedImage auswahl;
  BufferedImage muauswahl;
  
  
  int farbe;
  int mufarbe;
  
  public Karim() {
    setVisible(true);
    setTitle("District 12 Konfigurator");
    
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);
    
    CheckboxGroup cbkform = new CheckboxGroup();       
    Checkbox ckb_rund = new Checkbox("Rundhals",cbkform,true);
    Checkbox ckb_v = new Checkbox("V-Neck",cbkform,false);
    Checkbox ckb_polo = new Checkbox("Polokragen",cbkform,false);
    
    
    
    
    Label lbl_grund = new Label();
    final Choice chc_gfarbe = new Choice();
    Label lbl_muster = new Label();
    
    CheckboxGroup chbmuster = new CheckboxGroup();
    Checkbox chb_quer = new Checkbox("Querstreifen",chbmuster,true);
    Checkbox chb_laengs = new Checkbox("Längsstreifen",chbmuster,false);
    Checkbox chb_karo = new Checkbox("Karo",chbmuster,false);
    
    Choice chc_mufarbe = new Choice();
    
    Container cp = getContentPane();
    cp.setLayout(null);
    
    ckb_rund.setBounds(8, 24, 100, 20);
    
    cp.add(ckb_rund);
    ckb_v.setBounds(8, 40, 100, 20);
    
    cp.add(ckb_v);
    ckb_polo.setBounds(8, 56, 100, 20);
    
    cp.add(ckb_polo);
    lbl_grund.setBounds(0, 8, 110, 20);
    lbl_grund.setText("Trikot:");
    cp.add(lbl_grund);
    chc_gfarbe.setBounds(8, 80, 102, 20);
    chc_gfarbe.add("Rot");
    chc_gfarbe.add("Blau");
    chc_gfarbe.add("Grün");
    chc_gfarbe.add("Gelb");
    chc_gfarbe.add("Grau");
    cp.add(chc_gfarbe);
    lbl_muster.setBounds(0, 112, 102, 20);
    lbl_muster.setText("Muster:");
    cp.add(lbl_muster);
    chb_quer.setBounds(8, 128, 100, 20);
    
    cp.add(chb_quer);
    chb_laengs.setBounds(8, 144, 100, 20);
    
    cp.add(chb_laengs);
    chb_karo.setBounds(8, 160, 100, 20);
    
    cp.add(chb_karo);
    chc_mufarbe.setBounds(8, 184, 102, 20);
    chc_mufarbe.add("Hellblau");
    chc_mufarbe.add("Orange");
    chc_mufarbe.add("Weiß");
    cp.add(chc_mufarbe);
    
    ckb_rund.setState(true);
    
    chb_quer.setState(true);
    
    final JPanel trikot = new JPanel();
    trikot.setSize(new Dimension(200, 250));
    trikot.setPreferredSize(new Dimension(200, 250));
    trikot.setLocation(new Point(230, 5));
    contentPane.add(trikot, BorderLayout.NORTH);
    
    //Muster
    JPanel Muster = new JPanel();
    
    Muster.setSize(new Dimension(200, 250));
    Muster.setLocation(new Point(230, 5));
    contentPane.add(Muster);
    
    
    
    //Anzeige in Bild
    trikot.add(new JLabel(new ImageIcon(bild.getStartImage())));
    Muster.add(new JLabel(new ImageIcon(mubild.getStartImage())));
    
    
    
    
    
    
    // Farben (Muss immer vor der Formauswahl erfolgen da die Farbe sonst immer rot ist)
    chc_gfarbe.addItemListener(new ItemListener() {
      
      
      @Override
      public void itemStateChanged(ItemEvent e) {
        String Rot ="Rot";
        String Blau ="Blau";
        String Gruen="Grün";
        String Gelb="Gelb";
        String Grau="Grau";
        
        String aw = chc_gfarbe.getSelectedItem();
        if ( Rot.equals(aw))
        {
          farbe = 1;
        }
        else if(Blau.equals(aw))
        {
          farbe = 2;
        }
        else if(Gruen.equals(aw))
        {
          farbe = 3;
        }
        else if(Gelb.equals(aw))
        {
          farbe = 4;
        }
        else if(Grau.equals(aw))
        {
          farbe = 5;
        }
      }
    });
    
    // Form (V-Neck)
    
    ckb_v.addItemListener(new ItemListener() {
      
      @Override
      public void itemStateChanged(ItemEvent arg0) {
        
        if (farbe == 1)
        {
          try {
            auswahl = ImageIO.read(new File ("vrot.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (farbe == 2)
        {
          try {
            auswahl = ImageIO.read(new File ("vblau.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (farbe == 3)
        {
          try {
            auswahl = ImageIO.read(new File ("vgruen.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (farbe == 4)
        {
          try {
            auswahl = ImageIO.read(new File ("vgelb.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (farbe == 5)
        {
          try {
            auswahl = ImageIO.read(new File ("vgrau.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else 
        {
          try {
            auswahl = ImageIO.read(new File ("vrot.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        bild.setImage(auswahl);
        //Löscht das aktuelle Bild aus dem Panel
        trikot.removeAll();
        //Setzt das neue
        trikot.add(new JLabel(new ImageIcon(bild.getBild())));
        // Erneuert das Panel
        trikot.validate();
      }
    });
    
    //Formen (Polo)
    ckb_polo.addItemListener(new ItemListener() {
      
      @Override
      public void itemStateChanged(ItemEvent e2) {
        // TODO Auto-generated method stub
        
        if (farbe == 1)
        {
          try {
            auswahl = ImageIO.read(new File ("polorot.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (farbe == 2)
        {
          try {
            auswahl = ImageIO.read(new File ("poloblau.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (farbe == 3)
        {
          try {
            auswahl = ImageIO.read(new File ("pologruen.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (farbe == 4)
        {
          try {
            auswahl = ImageIO.read(new File ("pologelb.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (farbe == 5)
        {
          try {
            auswahl = ImageIO.read(new File ("polograu.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else 
        {
          try {
            auswahl = ImageIO.read(new File ("polorot.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        bild.setImage(auswahl);
        //Löscht das aktuelle Bild aus dem Panel
        trikot.removeAll();
        //Setzt das neue
        trikot.add(new JLabel(new ImageIcon(bild.getBild())));
        // Erneuert das Panel
        trikot.validate();
        
      }
    });
    
    
    
    //Formen (Rund)
    
    ckb_rund.addItemListener(new ItemListener() {
      
      @Override
      public void itemStateChanged(ItemEvent e3) {
        if (farbe == 1)
        {
          try {
            auswahl = ImageIO.read(new File ("rundrot.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (farbe == 2)
        {
          try {
            auswahl = ImageIO.read(new File ("rundblau.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (farbe == 3)
        {
          try {
            auswahl = ImageIO.read(new File ("rundgruen.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (farbe == 4)
        {
          try {
            auswahl = ImageIO.read(new File ("rundgelb.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (farbe == 5)
        {
          try {
            auswahl = ImageIO.read(new File ("rundgrau.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else 
        {
          try {
            auswahl = ImageIO.read(new File ("rundrot.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        bild.setImage(auswahl);
        //Löscht das aktuelle Bild aus dem Panel
        trikot.removeAll();
        //Setzt das neue
        trikot.add(new JLabel(new ImageIcon(bild.getBild())));
        // Erneuert das Panel
        trikot.validate();
        
      }
    });
    
    // Musterfarbe
    chc_mufarbe.addItemListener(new ItemListener() {
      
      
      @Override
      public void itemStateChanged(ItemEvent e) {
        String Hellblau ="Hellblau";
        String Orange ="Orange";
        String Weiss="Weiß";
        
        
        String amu = chc_mufarbe.getSelectedItem();
        if ( Hellblau.equals(amu))
        {
          mufarbe = 1;
        }
        else if(Orange.equals(amu))
        {
          mufarbe = 2;
        }
        else if(Weiss.equals(amu))
        {
          mufarbe = 3;
        }
        
      }
    });
    
    
    chb_quer.addItemListener(new ItemListener() {
      
      @Override
      public void itemStateChanged(ItemEvent arg0) {
        
        if (mufarbe == 1)
        {
          try {
            muauswahl = ImageIO.read(new File ("querhellblau.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (mufarbe == 2)
        {
          try {
            muauswahl = ImageIO.read(new File ("querorange.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (mufarbe == 3)
        {
          try {
            muauswahl = ImageIO.read(new File ("querweiß.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else 
        {
          try {
            muauswahl = ImageIO.read(new File ("querhellblau.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        mubild.setImage(muauswahl);
        //Löscht das aktuelle Bild aus dem Panel
        Muster.removeAll();
        //Setzt das neue
        Muster.add(new JLabel(new ImageIcon(mubild.getMubild())));
        // Erneuert das Panel
        Muster.validate();
      }
    });
    
    
    chb_laengs.addItemListener(new ItemListener() {
      
      @Override
      public void itemStateChanged(ItemEvent arg0) {
        
        if (mufarbe == 1)
        {
          try {
            muauswahl = ImageIO.read(new File ("laengshellblau.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (mufarbe == 2)
        {
          try {
            muauswahl = ImageIO.read(new File ("laengsorange.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (mufarbe == 3)
        {
          try {
            muauswahl = ImageIO.read(new File ("laengsweiß.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else 
        {
          try {
            muauswahl = ImageIO.read(new File ("laengshellblau.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        mubild.setImage(muauswahl);
        //Löscht das aktuelle Bild aus dem Panel
        Muster.removeAll();
        //Setzt das neue
        Muster.add(new JLabel(new ImageIcon(mubild.getMubild())));
        // Erneuert das Panel
        Muster.validate();
      }
    });
    
    
    
    chb_karo.addItemListener(new ItemListener() {
      
      @Override
      public void itemStateChanged(ItemEvent arg0) {
        
        if (mufarbe == 1)
        {
          try {
            muauswahl = ImageIO.read(new File ("karohellblau.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (mufarbe == 2)
        {
          try {
            muauswahl = ImageIO.read(new File ("karoorange.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else if (mufarbe == 3)
        {
          try {
            muauswahl = ImageIO.read(new File ("karoweiß.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        else 
        {
          try {
            muauswahl = ImageIO.read(new File ("karohellblau.png"));
          } 
          catch (IOException e) 
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
        
        mubild.setImage(muauswahl);
        //Löscht das aktuelle Bild aus dem Panel
        Muster.removeAll();
        //Setzt das neue
        Muster.add(new JLabel(new ImageIcon(mubild.getMubild())));
        // Erneuert das Panel
        Muster.validate();
      }
    });  
  }
    
}
 

Decline

Mitglied
Hallo

ich kann dir bei deinem Kernproblem gerade nicht helfen da ich keine Entwicklungsumgebung zur Verfügung habe.
ich denke das Problem liegt an der Art des BufferedImages die du mit ImageIO ladest.
Wenn dies der Fall ist kann ich es dir leider nicht in kurzen Sätzen erklären da ich sonst Gefahr laufe Schwachsinn zu erzählen was nur noch mehr Verwirrung stiftet.

Ich möchte kurz etwas zur Struktur deines Codes sagen.

Du solltest dir folgende Klasse anlegen:
Java:
public class KitImageLoader {

    public enum Color{
        green,
        blue,
        yellow,
        red
    }

    public static BufferedImage loadPoloImage(Color color) throws IOException{
        //color.name() gibt der den namen der enumvariable zurück
        //wenn der Wert der variable color z.b "red" ist,
        //dann würde der String filename nach der zuweisung den Wert "polo_red" enthalten
        //natürlich musst du dann auch noch deine Dateinamen entsprechend anpassen
        String filename = "polo_"+color.name();
        return ImageIO.read(new File(filename));
    }


    public static BufferedImage loadVneckImage(Color color) throws IOException{
        String filename = "vneck_"+color.name();
        return ImageIO.read(new File(filename));
    }


    public static BufferedImage loadRoundImage(Color color) throws IOException{
        String filename = "round_"+color.name();
        return ImageIO.read(new File(filename));
    }
}
für die Muster legst du dir eine ähnliche klasse an.

damit kannst du dann deinen Code erheblich vereinfachen.
statt diesem code hier kannst du den code von mir weiter unten nutzen.
Java:
ckb_polo.addItemListener(new ItemListener() {
     
      @Override
      public void itemStateChanged(ItemEvent e2) {
        // TODO Auto-generated method stub
       
        if (farbe == 1)
        {
          try {
            auswahl = ImageIO.read(new File ("polorot.png"));
          }
          catch (IOException e)
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
       
        else if (farbe == 2)
        {
          try {
            auswahl = ImageIO.read(new File ("poloblau.png"));
          }
          catch (IOException e)
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
       
        else if (farbe == 3)
        {
          try {
            auswahl = ImageIO.read(new File ("pologruen.png"));
          }
          catch (IOException e)
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
       
        else if (farbe == 4)
        {
          try {
            auswahl = ImageIO.read(new File ("pologelb.png"));
          }
          catch (IOException e)
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
       
        else if (farbe == 5)
        {
          try {
            auswahl = ImageIO.read(new File ("polograu.png"));
          }
          catch (IOException e)
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
       
        else
        {
          try {
            auswahl = ImageIO.read(new File ("polorot.png"));
          }
          catch (IOException e)
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
       
        bild.setImage(auswahl);
        //Löscht das aktuelle Bild aus dem Panel
        trikot.removeAll();
        //Setzt das neue
        trikot.add(new JLabel(new ImageIcon(bild.getBild())));
        // Erneuert das Panel
        trikot.validate();
       
      }
    });

Java:
ckb_polo.addItemListener(new ItemListener() {
     
      @Override
      public void itemStateChanged(ItemEvent e2) {

	//ACHTUNG: die variable farbe ist hier nicht mehr vom typ integer (siehe unten)
       try{
                 auswahl = KitImageLoader.loadPoloImage(farbe_noLONGERINTTYPE);
       
                bild.setImage(auswahl);
               //Löscht das aktuelle Bild aus dem Panel
                trikot.removeAll();
               //Setzt das neue
               trikot.add(new JLabel(new ImageIcon(bild.getBild())));
                 // Erneuert das Panel
               trikot.validate();
          }
          catch (IOException e)
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
       
      }
    });

wie schon im codeschnippsel angemerkt, musst du hier den typ der variable farbe von integer auf den enumtyp KitImageLoader.Color ändern.
Enums erscheinen dir viellicht auf den ersten blick sehr kompliziert, aber bei anwendungen wie dieser erleichtern sie dein leben erheblich.
Wenn du dir noch eine ähnliche Klasse zum laden der Muster anlegst kannst du deinen Code um mehr als die hälfte reduzieren was ihn um einiges übersichtlicher macht.

Ansonsten solltest du dir viellicht noch layout manager anschauen anstatt deine Komponenten alle von Hand zu platzieren.


Wenn ich nicht vergesse nehme ich mich zuhause nochmal des Problems an, aber ich will dich nicht auf einen falschen Weg schicken ohne meine Theorien vorher zu überprüfen :)

mfg
Decline
 
Zuletzt bearbeitet:

Kackrim

Mitglied
Danke für die schnelle Antwort Decline. Hab mir deinen Code angesehen der ist tatsächlich wesentlich übersichtlicher als mein 600 Zeilen IF-Monster :D. Werde den sowieso warscheinlich überarbeiten und die Bilder mit leichteren Namen versehen um die ausgabe einfache zu machen.
 

Decline

Mitglied
Hallo

ich hab mir dein Problem jetzt nochmal angesehen.
Das Problem liegt doch woanders als ich zuerst vermutet habe, also war es gut das ich nicht geantwortet habe ;)

Die Meisten Swing Elemente werden standardmäßig deckend (engl. opaque) gezeichnet.
Das gilt auch für deine beiden JPanels in denen du die Muster unt Trickots darstellst.

d.h. du musst für die beiden Panels die Methode setOpaque(false) aufrufen.
Auserdem musst du die Reihenfolge ändern in der du die Panels hinzufügst da Elemente die zuerste hinzugefügt wurden weiter oben erscheinen.

Allerdings könntest du dir die beiden JPanels sparen, und stattdessen gelich JLabels verwenden.
Anstatt dass du dann immer neue JLabels in die Panels einfügst setzt du dann einfach die Icons der Labels.
JLabels sind auserdem von vornherein auf opaque=false gesetzt.

mfg
Decline
 
Zuletzt bearbeitet:

Kackrim

Mitglied
Hey vielen Dank :toll:
Stimmt wie du gesagt hast ich hab das Musterlabel auf Opaque gesetzt und die Reihenfolge verändert und es läuft genauso wie ich es mir vorgestellt habe. Vielen dank für die sowohl schnelle als auch sehr gute Antwort, die für einen Anfänger wie mich verständlich war

Mit freundlichem Gruß Kackrim
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...

Oben