# Bild nicht in der Mitte



## Lucaaa (12. Jul 2018)

Hallo! (mal wieder)

Ich hab ein Panel mit einem Bild.
Jedoch ist das Bild nicht in der Mitte (Also Vertikal) Es soll oben und unten den gleichen Abstand zum Rand haben.
Ich hab auch den Eindruck, dass das ganze Panel, das das Image beinhaltet "ImageContainer" nicht mittig angeordnet (wieder vertical) wird.

Hoffe mir kann wer helfen.


```
package com.ludevstudio.passwordmanager;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
public class ItemPanel extends JPanel {
 
 JLabel iconContainer, labProvider, labAccount, labPassword;
 JPanel textContainer;
 
 
 
 
 
 Image icon;
 
 
 public ItemPanel() {
  try {
   icon = ImageIO.read(new File("icon.png"));
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  setBorder(new LineBorder(Color.black));
  setPreferredSize(new Dimension(450, 100));  // HIER SOLL DIE GRÖSSE AUTOM. ANGEPASST WERDEN
  setMinimumSize(this.getPreferredSize());
  setMaximumSize(this.getPreferredSize());
  setLayout(new FlowLayout(FlowLayout.LEFT));
 
  initComponents();
 }
 
 public void initComponents() {
  
  Font fontProvider = new Font("Arial", Font.BOLD, 36);
  Font fontAccount = new Font("Arial", Font.ITALIC, 28);
  
  
  
  
  iconContainer = new JLabel(new ImageIcon(getScaledImage(icon, 80, 80)));
  iconContainer.setPreferredSize(new Dimension(100, 100));
  iconContainer.setMaximumSize(iconContainer.getPreferredSize());
  iconContainer.setBorder(new LineBorder(Color.black));
  
  this.add(iconContainer);
  
  
  textContainer = new JPanel();
  textContainer.setLayout(new BoxLayout(this.textContainer, BoxLayout.PAGE_AXIS));
  labProvider = new JLabel("Microsoft OnleDrive");
  labProvider.setFont(fontProvider);
  textContainer.add(labProvider);
  labAccount = new JLabel("Laura Brandt");
  labAccount.setFont(fontAccount);
  textContainer.add(labAccount);
  this.add(textContainer);
 
 
  
 }
 
 private Image getScaledImage(Image srcImg, int w, int h){
     BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
     Graphics2D g2 = resizedImg.createGraphics();
     g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
     g2.drawImage(srcImg, 0, 0, w, h, null);
     g2.dispose();
     return resizedImg;
 }
 
}
```


----------



## mihe7 (12. Jul 2018)

Du solltest Dich dringend damit auseinandersetzen, wie das Layout in Swing funktioniert. Du verwendest FlowLayout, das passt die Größen der Komponenten nicht an, sondern verwendet die bevorzugte Größe der Komponenten, setzt sie nacheinander horizontal ausgerichtet in eine Zeile und bricht ggf. auf weitere Zeilen um.


----------



## Lucaaa (12. Jul 2018)

mihe7 hat gesagt.:


> Du solltest Dich dringend damit auseinandersetzen, wie das Layout in Swing funktioniert. Du verwendest FlowLayout, das passt die Größen der Komponenten nicht an, sondern verwendet die bevorzugte Größe der Komponenten, setzt sie nacheinander horizontal ausgerichtet in eine Zeile und bricht ggf. auf weitere Zeilen um.


Und was soll ich stattdessen am besten verwenden?


----------



## mihe7 (12. Jul 2018)

Lucaaa hat gesagt.:


> Und was soll ich stattdessen am besten verwenden?



Das Tutorial: https://docs.oracle.com/javase/tutorial/uiswing/layout/index.html 

Achtung: auf der linken Seite gibt es ein Menü...


----------



## Lucaaa (12. Jul 2018)

mihe7 hat gesagt.:


> Das Tutorial:


Da sich die Größe des Panels nie ändert, kann ich ja auch Problemlos null layout setzen oder?


----------



## Lucaaa (12. Jul 2018)

HAAAA!
Gott segne das BorderLayout


----------



## mihe7 (12. Jul 2018)

"null-Layout" und "problemlos" schließen einander aus.


Lucaaa hat gesagt.:


> Gott segne das BorderLayout


Wir kommen der Sache näher.


----------



## Lucaaa (12. Jul 2018)

mihe7 hat gesagt.:


> "null-Layout" und "problemlos" schließen einander aus.


Ähm ja, die Erfahrung hab ich schon gemacht.


mihe7 hat gesagt.:


> Wir kommen der Sache näher.


Ja. Es ist jetzt in der Mitte. Kann ich denn auch den Abstand von Komponenten bei einem FlowLayout vergrößern, sodass die nicht an einander kleben?


----------



## mihe7 (12. Jul 2018)

https://docs.oracle.com/javase/8/docs/api/java/awt/FlowLayout.html#FlowLayout-int-int-int-


----------



## Lucaaa (12. Jul 2018)

Hab schon gefunden. Danke


----------



## Lucaaa (12. Jul 2018)

mihe7 hat gesagt.:


> https://docs.oracle.com/javase/8/docs/api/java/awt/FlowLayout.html#FlowLayout-int-int-int-


Eine Sache noch:
Ich möchte Scrollen können.
Habs folgendermaßen versucht:

```
package com.ludevstudio.passwordmanager;
import java.awt.BorderLayout;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
public class ManagerPanel extends JScrollPane{
 // This Class contains the Manager
 JPanel panel;
 
 // Constructor and params
 public ManagerPanel() {
  panel = new JPanel();
  panel.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));
  panel.setMinimumSize(new Dimension(400, 100));
   setViewportView(panel);
   
   
   ItemPanel[] items = new ItemPanel[20];
   for (int i = 0; i<items.length; i++) {
    items[i] = new ItemPanel();
    panel.add(items[i]);
   
  
  
 }
 
 } 
}
```
Hat aber nicht geklappt. jetzt wird alles nebeneinander angezeigt, ohne jemals die Zeile zu wechseln.


----------



## mihe7 (12. Jul 2018)

Komponenten braucht man höchstens dann zu erweitern, wenn sich am "Verhalten" der Komponente etwas ändert. Ich sehe hier einfach nur eine simple Konfiguration:


```
public JComponent getManagePanel() {
    JPanel panel = new JPanel();
    ...
    return new JScrollPane(panel);
}
```


----------



## Lucaaa (12. Jul 2018)

mihe7 hat gesagt.:


> simple Konfiguration:


Und wo baue ich das jetzt ein?


----------



## mihe7 (12. Jul 2018)

Das kann ich Dir nicht sagen, ich weiß ja nicht, was Du eigentlich vor hast, wo Du das ManagerPanel brauchst usw. Im einfachsten Fall dort, wo Du das Panel brauchst.

Der Punkt dabei ist: Du erweiterst doch JTextField auch nicht zu Klassen NameTextFeld, VornameTextFeld, GeburtstagsTextFeld usw. sondern nimmst einfach das vorhandene JTextField her und konfigurierst es entsprechend. Beim Panel ist das nicht anders.


----------



## Lucaaa (12. Jul 2018)

mihe7 hat gesagt.:


> Das kann ich Dir nicht sagen, ich weiß ja nicht, was Du eigentlich vor hast, wo Du das ManagerPanel brauchst usw. Im einfachsten Fall dort, wo Du das Panel brauchst.


Ich möchte, In meinem Panel Scrollen Können.


----------



## Lucaaa (12. Jul 2018)

mihe7 hat gesagt.:


> dort, wo Du das Panel brauchst.


Habs jetzt so gemacht:

```
public JComponent getManagePanel() {
     JPanel panel = new JPanel();
     
     
    panel.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));
    panel.setMinimumSize(new Dimension(400, 100));
     ItemPanel[] items = new ItemPanel[80];
  for (int i = 0; i<items.length; i++) {
   items[i] = new ItemPanel();
   panel.add(items[i]);
}
     
     return new JScrollPane(panel);
 }
```
Ist aber das gleiche Problem wie vorher. Das FlowLayout bricht die Zeile nicht ab. Alle ItemPanels werden hintereinander angeordnet.


----------



## mihe7 (12. Jul 2018)

Ach so, hatte Dich falsch verstanden. 

Natürlich bricht die Zeile nicht um: https://docs.oracle.com/javase/8/docs/api/javax/swing/JScrollPane.html


----------

