# ImageIcon und JLabel



## Titanpharao (10. Jan 2008)

Hallo,

ich wollte einen eigenen Ladebalken realisieren.
Dazu wollte ich ein Label in der Größe von 0-100 Zeichnen lassen mit einem Bild drauf.

label.setSize(10,n); wobei n für 0-100 stehen kann.

Mein Problem ist jetzt, das Java einmal von oben anfängt zu zeichnen..das werde ich noch hinbekommen aber,

er zeichnet nicht von Stelle "0" im Bild. Er probiert immer die Mitte zu finden...wie kann ich das verhinder und das Bild immer im Koordinaten ursprung zeichnen?


----------



## Titanpharao (10. Jan 2008)

Oder anders Formuliert, wie kann ich das Image was ich auf meinem Label haben will von unten zeichnen? Egal ob das Label reicht von der größe oder nicht.


----------



## SlaterB (10. Jan 2008)

überschreibe am besten die paintComponent-Operation und male das Bild an eine feste Stelle


----------



## Titanpharao (10. Jan 2008)

Wie kann ich jetzt nur 50% des Bildes malen? Sicher mit BufferedImage oder sowas :-/
Habe das aber noch nicht benutzt, wäre nett wenn einer schnell mal parr Zeilen dafür hat.  :### 

danke


----------



## Titanpharao (10. Jan 2008)

Bringt mir doch auch nix...Java zeichnet immer noch das Bild von oben nach Unten...

Ich habe ein Bild. 100 Pixel mit einem Motiv. Dieses soll jetzt von unten nach oben hin aufgedeckt werden.

Also zeichne von unten nach oben n-Pixel...aber macht er ja nicht...


----------



## Leroy42 (10. Jan 2008)

Das liegt am Layout-Manager.

Wenn du unbedingt eine feste Position angeben willst,
benutze das Null-Layout:


```
jPanel.setLayout(null);
myLabel.setBounds(...);
```


----------



## Titanpharao (10. Jan 2008)

Nein, auch mit Bounce, schneidet er unten ab...
Er soll aber oben abschneiden.

zum beispiel das von einer spielfigur nur die füße zu sehen sind...
Ladebalken füllen sich meist von unten nach oben.


----------



## Leroy42 (10. Jan 2008)

Poste mal relevanten Code von dir


----------



## Titanpharao (10. Jan 2008)

```
package gui;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.*;


public class YinYang extends JPanel{
	JLabel yiyaramen=new JLabel(new ImageIcon("texture/hud/yiyaramen.gif"));
	JLabel yin=new JLabel(new ImageIcon("texture/hud/yin.gif"));
	JLabel yang=new JLabel(new ImageIcon("texture/hud/yang.gif"));
	JLabel yiya=new JLabel(new ImageIcon("texture/hud/yiya.gif"));
	BufferedImage img; 
	
	public YinYang(){
		this.setLayout(null);
		this.setSize(100, 100);
		yiyaramen.setSize(100, 100);
		yiyaramen.setLocation(0, 0);	
		yin.setLocation(0, 0);
		yang.setLocation(0,0);		
		yiya.setLocation(0, 0);
		this.add(yiyaramen);
		this.add(yin);
		this.add(yang);
		this.add(yiya);		
	}
	public void setValue_HP(int hp){
		yin.setSize(100, hp);
	}
	public void setValue_MP(int mp){
		yang.setSize(100, mp);
	}
	public void setValue_EXP(int exp){
		yiya.setSize(100, exp);
	}
	
	public static void main(String[] args) {
		JFrame x=new JFrame();
		x.setSize(500,500);		
		YinYang y=new YinYang();
		y.setValue_MP(75);
		x.add(y);
		x.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}});
		x.setVisible(true);		
	}

}
```

Wird aber auch nicht weiter helfen. Das ist nur das Grundgerüst. 

Ok ich erzähl mal genau was passieren soll. Ihr kennt sicher ein Yin-Yang Symbol. Jetzt wollte ich die linke weise fläche als Lebenspunkte-Anzeige machen die rechte schwarze als Mana und einen Stich in der Mitte für die Erfahrung.

Also dachte ich mir, nehme ich 4 Bilder. 

1.Rahmen
2.Weise Fläche
3.Schwarze Fläche
4.Strich

Das ganze ist genau 100 Pixel hoch. Also wenn ich vom weisen Teil nur die unten 40 Pixel zeichne, habe ich 40% Leben. Aber durch die Form des Symbol brauche ich NUR die 40 Pixel unten.


----------



## SlaterB (10. Jan 2008)

ein dahingeschmiertes Beispiel von mir:


```
public class TestGUI
    extends JFrame
{

    private JLabel l = new JLabel()
        {
            protected void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                g.fillArc(0, -370 + getSize().height, 370, 370, 0, 360);
            }
        };

    private Runnable r = new Runnable()
        {
            public void run()
            {
                for (int i = 0; i < 100; i++)
                {
                    try
                    {
                        Thread.sleep(100);
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                    l.setPreferredSize(new Dimension(100, 3 * i));
                    l.setSize(new Dimension(100, 3 * i));
                    TestGUI.this.getContentPane().validate();
                    System.out.println("i: " + i);
                }
            }

        };

    public TestGUI()
        throws Exception
    {

        l.setBorder(BorderFactory.createLineBorder(Color.GREEN));
        l.setPreferredSize(new Dimension(100, 0));
        add(BorderLayout.SOUTH, l);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 400);
        setVisible(true);

        new Thread(r).start();
    }

    public static void main(String[] args)
        throws Exception
    {
        new TestGUI();
    }
}
```
besser ist aber, wenn die Kompoente von Anfang an einen festen Platz einnimmt und nur das Zeichnen in der paintComponent langsam ansteigt


----------



## Titanpharao (10. Jan 2008)

Schöner Kreis, geht das auch für ein IMAGE?


----------



## SlaterB (10. Jan 2008)

bisschen musst du auch selber machen 
klar geht das alles, kannst ja genau angeben, wohin das Bild gemalt werden soll, mit ner Minuskoordinate sieht man nur das untere Ende


----------



## Titanpharao (10. Jan 2008)

Kann man nicht einfach einen Teil aus dem Bild auschneiden...


----------



## SlaterB (10. Jan 2008)

..

so wie in meinem Beispiel, du malst das Bild ganz normal bei -100,
dann sind die ersten 100 Höhe logischerweise nicht zu sehen


----------



## Titanpharao (10. Jan 2008)

Verdammt jetzt bin ich durcheinander  :?   

So richtig wills ne, wie ich mir das vorstelle.


----------



## Titanpharao (10. Jan 2008)

habe das jetzt mal alles bissel gekürzt....warum zeichnet es das Bild nicht


```
package gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class TestGUI extends JFrame{

Image test1;
	
private JLabel l = new JLabel() 
    { 
        public void paint(Graphics g) 
        { 
        	g.drawImage(test1,0,0,this);
            super.paintComponent(g);                   
            //g.fillArc(0, -270 + getSize().height, 100, 100, 0, 360);
           // g.fillRect(0,0,100,100);
        } 
    }; 

public TestGUI(){  
    l.setBorder(BorderFactory.createLineBorder(Color.GREEN)); 
    l.setPreferredSize(new Dimension(100, 50)); 
    add(BorderLayout.SOUTH, l); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(200, 200); 
    setVisible(true); try {
    	test1=Toolkit.getDefaultToolkit().getImage("texture/hud/yang.gif");	
	} catch (Exception e) {
		e.getStackTrace();	
	}    
} 

public static void main(String[] args) 
    throws Exception 
{ 
    new TestGUI(); 
} 
}
```


----------



## SlaterB (10. Jan 2008)

wei du nach dem Zeichnen des Bildes noch den
super.paintComponent(g);-Aufruf hast,
der die Komponente mit der Hintergrundfarbe glatt malt?


----------

