Probleme mit paintComponent()

Status
Nicht offen für weitere Antworten.
Hallo,

ich suche den Fehler in meiner paintComponent-Methode in der Klasse HKLabel. Die damit gezeichneten Strings und Rechtecke werden leider nicht ausgegeben. Hat jemand eine Idee?

Java:
public class HinzKunzSwing extends JFrame implements ChangeListener {
        
        private JSlider sliderHinz = null;
        private JSlider sliderKunz = null;
        private float schieberWertHinz = 10;
        private float schieberWertKunz = 10;
        private Container contentPane;
        private static Color gray;
        private String vergleich = "Noch nichts passiert...";
        
        public HinzKunzSwing(String title) {
            
            super(title);
            contentPane = getContentPane();
            contentPane.setLayout(new GridLayout(5,4));
            contentPane.setBackground(gray);
            
            sliderHinz = new JSlider(JSlider.HORIZONTAL, 0, 100, 0); 
            sliderKunz = new JSlider(JSlider.HORIZONTAL, 0, 100, 0); 
            sliderHinz.setBounds(20, 110, 170, 20);
            sliderKunz.setBounds(200, 110, 170, 20);
            
            contentPane.add(new JLabel("Hinz: "));
            contentPane.add(new JLabel("Kunz: "));
            contentPane.add(sliderHinz);
            contentPane.add(sliderKunz);
            HKLabel ausgabe = new HKLabel(vergleich, schieberWertHinz, schieberWertKunz);
            contentPane.add(ausgabe);
            contentPane.add(new JLabel ("Vergleich der Korpergrößen - Verschieben Sie die Scrollbars!"));
           
            sliderHinz.addChangeListener(this);
            sliderKunz.addChangeListener(this);
            
            setSize(600, 600 );
            setLocation(50, 30);
            setVisible( true );
            
            MeinWindowAdapter meinWa = new MeinWindowAdapter();
            addWindowListener(meinWa);
        }
 class MeinWindowAdapter extends WindowAdapter {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        }
        
        public void stateChanged(ChangeEvent e) {
            if (e.getSource() == sliderHinz) schieberWertHinz = sliderHinz.getValue();
            if (e.getSource() == sliderKunz) schieberWertKunz = sliderKunz.getValue();
     
            if (schieberWertKunz == schieberWertHinz) vergleich = "Beide sind gleich groß!";
            if (schieberWertKunz < schieberWertHinz) vergleich = "Hinz ist größer!";
            if (schieberWertKunz > schieberWertHinz) vergleich = "Kunz ist größer!";
            
            repaint();
        }
        
    public static void main(String[] args) {
        new HinzKunzSwing("Hinz und Kunz - Swing");
    }

Java:
public class HKLabel extends JLabel {
public HKLabel(String vergleich, float schieberWertHinz, float schieberWertKunz){
        this.vergleich = vergleich;
        this.schieberWertHinz = schieberWertHinz;
        this.schieberWertKunz = schieberWertKunz;
    }
    
    public void paintComponent(Graphics g) {
        
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        
        String hinz = "Hinz: ";
        String kunz = "Kunz: ";
        String anzeige = vergleich;      
        
        Rectangle2D.Float floatRectHinz = new Rectangle2D.Float (50, 200, schieberWertHinz, 30);
        Rectangle2D.Float floatRectKunz = new Rectangle2D.Float (50, 250, schieberWertKunz, 30);

        g.drawString(anzeige, 100, 180); 
        g.drawString(hinz,10,200);
        g2.setColor(red);
        g2.fill(floatRectHinz); 
        g.drawString(kunz, 10, 250);
        g2.setColor(yellow);
        g2.fill(floatRectKunz);
    }
}
 
Du teilst das Frame mit dem GridLayout in ein gleichmässige 5x4 Rechtecke. Diese Rechtecke sind dann einen Fünftel der Gesamthöhe hoch. Weil du die Size auf 600 setzt, also etwas weniger als 120 (es wird noch etwas für die Frame Dekoration abgezogen). Wenn du jetzt auf die Pixel mit y-Koordinate 250 etwas zeichnest, dann liegt das ausserhalb der Komponente und wird folglich nicht gezeichnet. Um zu sehen, wo die Komponenten mit dem paintComponent wirklich ist und zeichnen kann, kannst du [c]g2.fillRect(0,0,500,500);[/c] aufrufen, dann wird der Bereich farblich markiert.
Deine gesetzte Grösse via den setBounds Befehlen, haben wegen des GridLayouts keinerlei Auswirkung, werden schlicht ignoriert.

Wahrscheinlich wirst du hier mit dem GridLayout nicht weit kommen, Alternativen wären GridBagLayout, TableLayout oder eine Kombination von mehreren.

Gibt es einen Grund, warum du HKLabel von JLabel erbt? Die Methoden der JList werden ja nirgendwo gebraucht. Ich glaube JPanel oder JComponent wären besser.
 
Danke, das klingt gut! Habe den paintComponent-Bereich jetzt schon mal gefunden 🙂. Für JLabel gibt´s tatsächlich keinen Grund, habe JComponent genommen und werde dann mal einen anderen Layout-Manager versuchen...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben