JPanel Transparent

Status
Nicht offen für weitere Antworten.

RedBulle

Neues Mitglied
Hallo Leude
Ich hab folgendes Problem: Ich will ein Auf ein Hintergrundbild einige buttons und Labels anordnen, dazu möcht ich halt einige Panels auf mein Hintergrundbild setzen die Transparent sind und nur die Labels die auf dem Panel drauf liegen anzeigen. Im Moment zeigt er mir aber nur zwischen den Labels einen grauen Hintergrund an der über meinem Hintergrundbild drauf liegt.

Java:
public class Main {



    public static void main(String[] args) {
        Icon ic = new ImageIcon("bilder/voll.jpg");
        Icon is = new ImageIcon("bilder/exit.jpg");
        ImagePanel panel = new ImagePanel(new ImageIcon("bilder/bg.jpg").getImage());
        JFrame frame = new JFrame("Mein Testprogramm");
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setLocation(200, 100);
        JPanel x = new JPanel();
        JLabel L = new JLabel();
        JLabel L2 = new JLabel();
        x.setOpaque(false);
        x.add(L);
        x.add(L2);
        x.setLayout(new GridLayout(0,2));
        L.setIcon(ic);
        L2.setIcon(is);
        frame.add(x, BorderLayout.SOUTH);
    }

}
class ImagePanel extends JPanel {

  private Image img;
  public ImagePanel(String img) {
    this(new ImageIcon(img).getImage());
  }

  public ImagePanel(Image img) {
    this.img = img;
    Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
    setPreferredSize(size);
    setMinimumSize(size);
    setMaximumSize(size);
    setSize(size);
    setLayout(null);
  }

  public void paintComponent(Graphics g) {
    g.drawImage(img, 0, 0, null);
  }
}
 
Du legst das Panel [c]x[/c] nicht über das ImagePanel [c]panel[/c], sondern Du legst es im Süden an.

Code:
------------------------------------------------------
|                                                    |
|    ###                                             |
|    ###                                             |
|    ###                                             |
|    ###                                             |
|    ###  # ### ###    #####    #####    #####       |
|    ###  ### ### ##  ##   ##  ##   ##  ###  ##      |
|    ###  ##  ##  ##  ##   ##  ##   ##  ######       |
|    ###  ##  ##  ##  ##   ##  ##  ###  ###          |
|    ###  ##  ##  ##   #### ##  ### ##   ######      |
|                                   ##               |
|                               #####                |
|                                                    |
------------------------------------------------------
|           LABEL1       |  |       LABEL2           |
------------------------------------------------------
Unten ist gar kein Bild mehr und Du siehst die Farbe des Fensters durch.

Ebenius
 
ok danke für die schnelle antwort. Das klingt auch einleuchtend was du sagst. Aber ich muss ja meine labels/buttons irgendwie auf dem Bild anordnen. Wie mach ich dass dann? Kann ich die labels auf mein Imagepanel drauf legen und dann mit .setlocation ?? Kann ich mir nicht wirklich vorstellen.

EDIT: Inzwischen klappts, ein Freund konnte mir weiterhelfen. Für alle die per google oder SuFu hierhinfinden:
Die Override annotaiton die von Netbeans gefordert wurde bei Paintcomponent muss weg. Und dann tatsälich einfach die Labels zum panel hinzufügen und mit setlocation. Allerdings muss des Layout auf Null gesetzt werden und dann eben visible und setsize zu dem Label hinzugefügt werden:
Java:
public class Main {



       public static void main(String[] args) {
        Icon ic = new ImageIcon("bilder/voll.jpg");
        Icon is = new ImageIcon("bilder/exit.jpg");
        ImagePanel panel = new ImagePanel(new ImageIcon("bilder/bg.jpg").getImage());
        JFrame frame = new JFrame("Mein Testprogramm");
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setLocation(200, 100);
        JLabel L = new JLabel();
        JLabel L2 = new JLabel();
        panel.add(L);
        panel.add(L2);
        panel.setLayout(null);
        L.setLocation(200, 200);
        L.setVisible(true);
        L.setSize(ic.getIconWidth(), ic.getIconHeight());
        L.setIcon(ic);
        L2.setIcon(is);

    }

}
class ImagePanel extends JLayeredPane {

  private Image img;
  public ImagePanel(String img) {
    this(new ImageIcon(img).getImage());
  }

  public ImagePanel(Image img) {
    this.img = img;
    Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
    setPreferredSize(size);
    setMinimumSize(size);
    setMaximumSize(size);
    setSize(size);
    setLayout(null);
  }

    public void paintComponent(Graphics g) {
    g.drawImage(img, 0, 0, null);
  }
}
 
Zuletzt bearbeitet:
Die Override annotaiton die von Netbeans gefordert wurde bei Paintcomponent muss weg.
Nein. Ab Java 5 sollte sie drin sein. Bis Java 1.4 (inkl.) gab es keine Annotations. Wenn die Annotation fehlt, ist das ungünstig; Begründungen hier: The Java™ Language Tutorial: Annotations (runter scrollen bis "Annotations used by the Compiler").

Und dann tatsälich einfach die Labels zum panel hinzufügen und mit setlocation. Allerdings muss des Layout auf Null gesetzt werden und dann eben visible und setsize zu dem Label hinzugefügt werden
An sich richtig, aber [c]null[/c]-Layout ist immer schlecht. Schöner, wenn Du ein Layout benutzt, das das kann was Du möchtest. Am einfachsten geht es so:
[java=17]final JPanel southPanel = new JPanel(new GridLayout(1, 0));
southPanel.setOpaque(false);
southPanel.add(L);
southPanel.add(L2);
panel.setLayout(new BorderLayout(6, 6));
panel.add(southPanel, BorderLayout.SOUTH);[/code]
Ebenius
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben