Images auf JPANEL?

Status
Nicht offen für weitere Antworten.
P

pb

Gast
MOIN MOIN

ich hab so zwei Probleme...
also erstmal habe ich ein JPanel wo ich ein Label mit einen Image drauf zeichne und dieses JPanel einen Haupt JPanel dann zufüge...
Code:
JPanel hauptpanel = new JPanel();	   
JPanel panel = new JPanel();
jpnew.setPreferredSize(new java.awt.Dimension(200, 100)); 

image =	ImageIO.read(new File("bild.jpg"));
			JLabel label = new JLabel(new ImageIcon(image));
			label.setSize(20,20);
			panel .add(new JCheckBox());
			panel .add(label);
	
	   
	   hauptpanel .add(panel );
Mein erstes Problem ist dass das Image zu groß ist, das panel ist von der größe richtig aber von den Bildern ist nur ein Ausschnitt zu sehen. Wie kann man die größe des Images verändern???

Mein zweites Problem ist dass ich mehr als nur ein panel (jetzt mit einen anderen Bild :D ) hinzufügen will. Aber es wird nicht angezeigt oder ich kanns nicht sehen.

Kann mir einer helfen???
 

Oli

Top Contributor
Deinem Panel fehlt ein LayoutManager.
Je nachdem wie du die Images anordnen möchtest gibt es hierfür den passenden Layoutmanager.
 

Marco13

Top Contributor
Bezüglich der Bildgröße: Da kommt es drauf an, ob du das Bild EINmal am Anfang auf eine bestimmte Größe bringen willst, oder ob sich die Größe dynamisch anpassen soll. Für ersteres kannst du image.getScaledInstance verwenden, für letzteres ... nochmal bescheid sagen.

EDIT: Das Panel, wo Mehrere Sachen draufliegen sollen, braucht i.a. einen LayoutManager
 
P

pb

Gast
Ich hab es mal so ausprobiert
ich lass in einer Schleife ein String Array durchlaufen wo ich für jedes element des Arrays ein neues ImageJPanel erzeuge und das dann den Hauptpanel hinzufüge

Code:
public class ImageJPanel extends JPanel{
	
	private Image image;
	private JLabel label;
    private String path; 
    
	
	public ImageJPanel(String pic)
	{
		try
		{
			setPreferredSize(new java.awt.Dimension(135, 108)); 
			setBorder(BorderFactory.createLineBorder(blue));
			setBackground(white);
			
			image =	ImageIO.read(new File(pic));
			image = image.getScaledInstance(100, 100, 0);
			label = new JLabel(new ImageIcon(image));
		
			this.path = pic;
			this.add(jcb);
			this.add(label);
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
	}
}

Klappt ganz gut. Aber das mit dem LayoutManager muss ich aber wohl dennoch machen er zentriert die Objekte innerhalb der Hauptpanels und ich würde linksbündig vorziehen...

Aber noch ein Problem er braucht ganz schön lange wenn ich ein Array mit mehr als 5 Bildnamen erstelle
Also eins mit 30 dauert scho fast ewig ???:L :bahnhof:
 
P

pb

Gast
Was ist mit einem VolatileImage??? Hab bisher nur ein Kommentar davon gelesen. Weiss einer ob ich das nutzen könnte?
 
P

pb

Gast
Anwendungsfall? Ein Panel das mir alle Bilder von einen Ordner anzeigt. Und wenn Ordner viele Bilder hat kommt das Programm ziemlich in Stocken also über 10 Sekunden stillstand.
 

Marco13

Top Contributor
Ja, ich kann's mir vorstellen: Ein Ordner mit 1000 Bildern á 3000x2000 Pixel bei 1.2 MB, und dann die Frage: Geht das nicht schneller? Wenn das ein Browser mit Thumbnail-Ansicht werden soll, kann man die Bilder "on the fly" kleiner zeichnen, oder sich mit getScaledInstance & Co verkleinerte Instanzen erstellen (was vmtl dann sinn macht, wenn man rumscrollen oder die Thumbnails in einer "Cache"-Datei speichern will). Ansonsten kann man natürlich dafür sorgen, dass nur die Bilder verkleinert werden, die man auch auf dem Bildschirm sieht... Aber unabhängig davon kommt jeder Programmierer irgendwann zu der traurigen und folgenschweren Erkenntnis: Computer sind, schnell, und werden immer schneller immer schneller, aber sie werden NIE schnell genug sein....
 
P

pb

Gast
Habs jetzt mal anders probiert mit nem jeditorpane
Code:
public class ImagePanel extends CheckPanel { 
	
    private Color black = new Color(0,0,0);    
    private String path;
    private JEditorPane jep = new JEditorPane();
    private String htmlhead = "<html><body><img src='file:///";
    private String htmlfood = "' width=100 height=100 border=1></body></html>";   
     
    public ImagePanel(String pic)
    {
		this.path = pic;			
		
		setPreferredSize(new java.awt.Dimension(150, 120));
		setBorder(BorderFactory.createLineBorder(black));
		
		jep.setToolTipText(path);	
		jep.setContentType("text/html");
		jep.setText(htmlhead + pic + htmlfood);

		this.setDoubleBuffered(true);	
		this.add(getJcb());
		this.add(jep);
    }
Code:
public abstract class CheckPanel extends JPanel {
	
	private JCheckBox jcb = new JCheckBox();
	
    public void selection(boolean set)
    {
    	if(set)
    		getJcb().setSelected(true);
    	else
    		getJcb().setSelected(false);
    }
    
    public JCheckBox getJcb() 
    {
		return jcb;
	}
}

Also jetzt brauch ich so ca 10-12 Sekunden für einen Ordner mit 70 Bilder (JPEG, bei anderen Formaten dauerts länger)


Anonymous hat gesagt.:
vor allem musst du aufpassen dass du kein heap space error bekommst ;)

Den hatte ich schon :autsch:
 

Marco13

Top Contributor
Dafür eine JEditorPane zu verwenden ist schon ... SEHR ... unkonventionell... :? Warum nicht einfach ein JPanel, bei dem in der paintComponent das Bild (optional verkleinert) gezeichnet wird?
 
P

pb

Gast
Ich habs halt mal probiert und von der Geschwindigkeit kommt es mir schneller vor. Vielleicht bilde ich mir das auch nur ein.
 
P

pb

Gast
Vorm Editorpane hatte ich es so probiert :

Code:
public class ImageJPanel extends JPanel{

	private JLabel label;
    private Color black = new Color(0,0,0);
    private JCheckBox jcb = new JCheckBox();
    private String path;
    
    private BufferedImage buffimage = null;
	Graphics2D g = null;
	
    public String choosen()
    {
    	if(jcb.isSelected())
    		return path;
    	return "";
    }
    
    public void selection(boolean set)
    {
    	if(set)
    		jcb.setSelected(true);
    	else
    		jcb.setSelected(false);
    }
	
    public JCheckBox getJcb() 
    {
		return jcb;
	}
    
	public ImageJPanel(String pic)
	{
		try
		{
			setPreferredSize(new java.awt.Dimension(135, 108)); 
			setBorder(BorderFactory.createLineBorder(black));

			buffimage = ImageIO.read(new File(pic));
			g = buffimage.createGraphics();
			buffimage = Relic.getScaledInstance(buffimage, 100, 100,RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR, false);
			
			label = new JLabel(new ImageIcon(buffimage));
			
			this.path = pic;
			this.add(jcb);
			this.add(label);

		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
	}
}

Vom Heapproblem sind beide Varianten betroffen und von der Geschwindigkeit kam mir die JEdiotorPane variante ein Tick schneller vor
 

Marco13

Top Contributor
Ja, du hast immernoch nicht gesagt, was du eigentlich machen willst. Wenn du das ImagePanel so schreiben würdest
Code:
public class ImageJPanel extends JPanel{

    private Color black = new Color(0,0,0);
    private JCheckBox jcb = new JCheckBox();
    private String path;
   
    private BufferedImage buffimage = null;
   
    public String choosen()
    {
       if(jcb.isSelected())
          return path;
       return "";
    }
   
    public void selection(boolean set)
    {
       if(set)
          jcb.setSelected(true);
       else
          jcb.setSelected(false);
    }
   
    public JCheckBox getJcb()
    {
      return jcb;
   }
   
   public ImageJPanel(String pic)
   {
      try
      {
         setPreferredSize(new java.awt.Dimension(135, 108));
         setBorder(BorderFactory.createLineBorder(black));

         buffimage = ImageIO.read(new File(pic));

         this.path = pic;
         this.add(jcb);
         this.add(label);

      }
      catch (Exception ex)
      {
         ex.printStackTrace();
      }
   }

   public void paintComponent(Graphics g)
   {
      super.paintComponent(g);
      g.drawImage(buffimage, 0,0, 100, 100, this); // Position (0,0), Größe (100,100)
   }

}
dann würde das Laden und erstellen sicher ein vielfaces schneller gehen, aber das Zeichnen entsprechend langsamer... da gäb's dann ggf. noch "Mitteldinger", aber die beiden Alternativen hat man: Das Bild kleiner MACHEN oder es nur kleiner ZEICHNEN....
 
P

pb

Gast
Hatte doch geschrieben was ich wollt, oder?:
Eine Bilderansicht auf einen Ordner wo ich dann mit den Checkboxen auswählen kann welche Bilder ich in einen anderen Ordner kopiere. Was soll an der Lösung mit dem EditorPane mit Html so schlecht sein. Hab nur bei einen Ordner das Problem das beim repaint mir Ecipse abschmiert.
 

Marco13

Top Contributor
Die Lösung ist nicht "schlecht", aber ein ziemlicher Overkill: Ein JEditorPane ist nicht dafür gedacht, Images (schnell) anzuzeigen, sondern dafür, HTML anzuzeigen (damit zwar auch Bilder, aber wenn man nur ein Bild anzeigen will, braucht man den ganzen Rest ja nicht). Wie auch immer. Wenn alles funktioniert, ist's ja OK :roll:
 
P

pb

Gast
Hab mal auf einer Internetseite(StudiVZ) einen Uploader gesehen wo das zeichnen und neuzeichen (beim runterscrollen) in Ordnung war, was verwenden die den nen Image auf nen Panel oder was anderes?
 
P

pb

Gast
Hab mal auf einer Internetseite(StudiVZ) einen Uploader gesehen wo das zeichnen und neuzeichen (beim runterscrollen) in Ordnung war, was verwenden die den nen Image auf nen Panel oder was anderes?
 
P

pb

Gast
Ok, hab jetzt den Editorpane rausgeschmissen :lol:

Code:
public abstract class CheckPanel extends JPanel {
	
	private JCheckBox jcb = new JCheckBox();
	
    public void selection(boolean set)
    {
    	if(set)
    		getJcb().setSelected(true);
    	else
    		getJcb().setSelected(false);
    }
    
    public JCheckBox getJcb() 
    {
		return jcb;
	}
}
Code:
public class ImageJPanel extends CheckPanel{

    private Color white = new Color(255,255,255);
    private Color black = new Color(0,0,0);
    private String path;
    
    private BufferedImage buffimage = null;
	
    public String choosen()
    {
    	if(getJcb().isSelected())
    		return path;
    	return "";
    }
    
    public void selection(boolean set)
    {
    	if(set)
    		getJcb().setSelected(true);
    	else
    		getJcb().setSelected(false);
    }
    
	public ImageJPanel(String pic)
	{
		try
		{
			this.setPreferredSize(new java.awt.Dimension(80, 60)); 
			this.setLayout(new FlowLayout(FlowLayout.LEFT));
			
			this.setBorder(BorderFactory.createLineBorder(black));
			this.setBackground(white);			
			getJcb().setBorder(null);	
			
			buffimage = ImageIO.read(new File(pic));
			buffimage = Util.getScaledInstance(buffimage, 80, 60,RenderingHints.VALUE_RENDER_SPEED, false);
			this.path = pic;
			this.add(getJcb());

		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
	}   

	public void paintComponent(Graphics g)
	{
	      super.paintComponent(g);
	      g.drawImage(buffimage, 0,0, 80, 60, this); // Position (0,0), Größe (100,100)
	} 		
}
Code:
public static BufferedImage getScaledInstance(BufferedImage img,
	            int targetWidth,
	            int targetHeight,
	            Object hint,
	            boolean higherQuality)
	    {
			int type = (img.getTransparency() == Transparency.OPAQUE) ?
			BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
			BufferedImage ret = (BufferedImage)img;
			int w, h;
			if (higherQuality) {
				w = img.getWidth();
				h = img.getHeight();
			} else {
				w = targetWidth;
				h = targetHeight;
			}
			
			do {
				if (higherQuality && w > targetWidth) 
				{
					w /= 2;
					if (w < targetWidth) 
					{
						w = targetWidth;
					}
				}
			
				if (higherQuality && h > targetHeight) 
				{
					h /= 2;
					if (h < targetHeight) 
					{
						h = targetHeight;
					}
				}
			
				BufferedImage tmp = new BufferedImage(w, h, type);
				Graphics2D g2 = tmp.createGraphics();
				g2.setRenderingHint(RenderingHints.KEY_RENDERING, hint);
				g2.drawImage(ret, 0, 0, w, h, null);
				g2.dispose();
			
				ret = tmp;
			} while (w != targetWidth || h != targetHeight);
			
			return ret;
	}

Funktioniert ganz gut auch wenn das Laden bei vielen(oder großen) Bilder recht lange dauert.

Weiss einer was ich ändern muss um diesen Panel Drag & Drop fähig zu machen?
Also ich will ein Bild(ImagePanel) anklicken und dann auf ein anderen Panel(das einen Ordner darstellt) ziehen und beim loslassen soll der dahin kopiert werden. Schon mal danke für jede Antwort
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
DaCrazyJavaExpert Erste Schritte Images bei JAR mitexportieren Java Basics - Anfänger-Themen 58
J Wie kann ich Images per Tastendruck anzeigen/einfügen? Java Basics - Anfänger-Themen 3
Y resize von images Java Basics - Anfänger-Themen 1
Z Zwei Images auf einem JFrame - Aber nur eins wird angezeigt! Java Basics - Anfänger-Themen 5
R Images verschwinden? Java Basics - Anfänger-Themen 3
J Hoher Speicherverbrauch beim Zeichnen von Images aus einer ArrayList Java Basics - Anfänger-Themen 10
T Erste Schritte Speicher läuft voll, Diashow, Images Java Basics - Anfänger-Themen 7
Luk10 Images und Koordinaten Java Basics - Anfänger-Themen 4
E Probleme mit Images verschieben Java Basics - Anfänger-Themen 4
E java.lang.OutOfMemoryError beim Rotieren eines Images Java Basics - Anfänger-Themen 14
R Problem beim Laden eines Images Java Basics - Anfänger-Themen 7
O Images erstellen Java Basics - Anfänger-Themen 3
B Durchsichtige Images werden beim kopieren schwarz Java Basics - Anfänger-Themen 21
M images löschen mit *.jpg ? Java Basics - Anfänger-Themen 4
I Buffered Images vergleichen Java Basics - Anfänger-Themen 3
P Images im Archiv .jar Java Basics - Anfänger-Themen 9
E Images bzw jpegs speichern Java Basics - Anfänger-Themen 5
P Transparente Images Java Basics - Anfänger-Themen 5
H Images in jar Java Basics - Anfänger-Themen 6
S ordnerinhalt lesen , images als "greifbare" elemen Java Basics - Anfänger-Themen 3
megachucky wo gibts icons, images und sound dateien zum download? Java Basics - Anfänger-Themen 2
M Bildgröße (in Byte) eines Images ermitteln Java Basics - Anfänger-Themen 2
H Hotspots in Images Java Basics - Anfänger-Themen 2
richis-fragen Optisch JPanel BorderLayout vertikaler Rand dicker als horizontaler Rand Java Basics - Anfänger-Themen 4
N Klassen Hintergrundfarbe in JPanel ändert sich nicht Java Basics - Anfänger-Themen 3
J JSON mit einem JPanel Java Basics - Anfänger-Themen 3
J Ein mit UI-Designer erstelltes JPanel einblenden Java Basics - Anfänger-Themen 0
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
J Beim Start des Programms zB. eine Linie in JPanel ausgeben Java Basics - Anfänger-Themen 4
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
M HILFE JPanel - Graphics Java Basics - Anfänger-Themen 1
B Scrollbares Fenster (JScrollPane) mit JPanel scrollt nicht Java Basics - Anfänger-Themen 3
Zeppi JPanel responsive Grid Java Basics - Anfänger-Themen 0
J JPanel in JScrollPanel Java Basics - Anfänger-Themen 4
Elyt JPanel als HintergrundBild Java Basics - Anfänger-Themen 7
W 2 JPanel in einem JFrame Java Basics - Anfänger-Themen 4
B Wie kann man an ein JPanel eine Scrollbar anheften? Java Basics - Anfänger-Themen 8
O Swing JPanel Java Basics - Anfänger-Themen 4
CptK Klassen JPanel nach Ablauf der Spielzeit neuladen Java Basics - Anfänger-Themen 2
S JPanel wird nicht angezeigt Java Basics - Anfänger-Themen 1
D Animation JPanel Java Basics - Anfänger-Themen 1
M JLabels "verrutschen" beim übergeben von JPanel Java Basics - Anfänger-Themen 2
D Auf angeklicktes JPanel zugreifen Java Basics - Anfänger-Themen 5
D JPanel mehrere Formen zeichnen Java Basics - Anfänger-Themen 5
D JPanel passt die Größe nicht an Java Basics - Anfänger-Themen 22
Y Webinhalt JPanel Java Basics - Anfänger-Themen 6
D Erste Schritte JPanel verschiebt Fenster via setVisible Java Basics - Anfänger-Themen 5
Dechasa Interface JFrame mit mehreren Übereinander liegenden JPanel Java Basics - Anfänger-Themen 5
S JPanel variablenabhängig erstellen Java Basics - Anfänger-Themen 13
J Methoden Dinge auf einem JPanel paltzieren Java Basics - Anfänger-Themen 1
Z JPanel wird zweimal hinterinander gezeichnet.. Wieso? Java Basics - Anfänger-Themen 4
F JFrame resize verschiebt JPanel Java Basics - Anfänger-Themen 3
A altes JPanel entfernen und neues öffnen Java Basics - Anfänger-Themen 5
I A0-Format in jpanel anzeigen Java Basics - Anfänger-Themen 1
R NullPointerException wegen JPanel oder doch nicht ? Java Basics - Anfänger-Themen 7
J Probleme mit eigenem JPanel (IDE Eclipse) Java Basics - Anfänger-Themen 4
S JPanel wird versetzt auf JFrame gelegt Java Basics - Anfänger-Themen 2
V jab ich eclipse verrückt gemacht :D ? array Jpanel, Jlabel Grafik Fehler / Frage Java Basics - Anfänger-Themen 5
R Focus auf JPanel im Thread Java Basics - Anfänger-Themen 9
I Problem mit JPanel Java Basics - Anfänger-Themen 0
B JPanel ändert die Hintergrundfarbe nicht Java Basics - Anfänger-Themen 2
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
C JPanel in MessageDialog Java Basics - Anfänger-Themen 1
B JPanel/JFrame in ein Applet umwandeln (Webfähig) Java Basics - Anfänger-Themen 7
S Inhalt von JPanel erst nach Resize sichtbar Java Basics - Anfänger-Themen 2
M Listener einerm JPanel hinzufuegen Java Basics - Anfänger-Themen 3
gamebreiti Methoden JPanel nach clearAll() und add neu zeichnen Java Basics - Anfänger-Themen 1
S vom JPanel aus durch Mouselistener Internet aufrufen Java Basics - Anfänger-Themen 6
Z JPanel bleibt leer Java Basics - Anfänger-Themen 2
E Bild per Verzeichnis/JFileChooser auf JPanel laden Java Basics - Anfänger-Themen 13
Q JPanel Java Basics - Anfänger-Themen 2
K Erste Schritte jpanel in einer klasse auslagern Java Basics - Anfänger-Themen 3
I Anfängerfrage JPanel repaint() Java Basics - Anfänger-Themen 6
N String auf JPanel bewegen Java Basics - Anfänger-Themen 6
K Erste Schritte Jframe Im Jpanel Java Basics - Anfänger-Themen 4
S Layout mit JPanel in JScrollPanel funktioniert nicht Java Basics - Anfänger-Themen 3
S JPanel drucken -> PrinterException Java Basics - Anfänger-Themen 2
B JPanel -JTable Java Basics - Anfänger-Themen 2
H JPanel Hintergrund transparent setzen? Java Basics - Anfänger-Themen 10
A Input/Output Hashmap in einem JPanel via JList anzeigen Java Basics - Anfänger-Themen 8
L zoomen aus jpanel Java Basics - Anfänger-Themen 7
P Bekomme in meinen JPanel nur eine JComponente angezeigt Java Basics - Anfänger-Themen 7
A Methoden repaint() zeichnet JPanel falsch Java Basics - Anfänger-Themen 3
R JFrame über einen JPanel Java Basics - Anfänger-Themen 5
I Veränderungen am JPanel vom JDialog aus Java Basics - Anfänger-Themen 6
F JPanel zu klein Java Basics - Anfänger-Themen 5
D GUI - Objekte in JPanel nach oben schieben Java Basics - Anfänger-Themen 2
S JPanel wird nicht eingefügt Java Basics - Anfänger-Themen 3
P Netbeans Platform - JLabel und JPanel setLocation Problem Java Basics - Anfänger-Themen 2
Kenan89 JPanel mit JTable Java Basics - Anfänger-Themen 9
I JPanel in JPanel Java Basics - Anfänger-Themen 2
A Zugriff auf Komponente innerhalb einer JPanel Java Basics - Anfänger-Themen 8
J Auf einem JPanel ein JFrame platzieren Java Basics - Anfänger-Themen 10
S JPanel anzeige Java Basics - Anfänger-Themen 2
propra Wie mache ich einem JPanel mein bereits instanziertes Model bekannt Java Basics - Anfänger-Themen 9
T Zugreifen auf JPanel Java Basics - Anfänger-Themen 4
K JPanel auslagern Java Basics - Anfänger-Themen 9
J Paint Methode von JPanel aufrufen Java Basics - Anfänger-Themen 15
T Tastendruck simulieren in JPanel Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben