Java 2 Panelsbild,buttons in ein Frame

Hallo.

Ich habe 2 Panels erstellt.
In dem 1 Panel hab ich ein Label erstellt. In dem Label befindet sich ein Bild das mein Hintergrundbild sein soll.
In dem 2 Panel habe ich 3 Buttons. Die möchte ich nun auf dem 1 Panel drauf haben.

Ich habe jetzt zwei Panel die wenn ich auf die ContentPane schreib sich überschreiben.
Als Layout benutze ich ein BorderLayout

Danke im vorraus.
Gruß
Jackii

Hallo,

also mir ist erstmal noch alles unklar. Schreib bitte was du am Ende haben möchtest, dann womit es Probleme gibt und am besten noch Quellcode dazu.

Hallo,

Ich habe auf Antwort geklickt und diesen Text geschrieben.

Gruß
Honeyhead

Ich will für ein Spiel den Startbildschirm machen.
Hier ist auch mal der Quellcode:

public class StartBild extends JFrame implements ActionListener {
JPanel StartPanel;
JPanel BildPanel;

private JButton startBut = new JButton(„Javio starten“);
private JButton highBut = new JButton(„Highscoreliste“);
private JButton endeBut = new JButton(„Javio beenden“);

public StartBild() {

BildPanel = new JPanel();
StartPanel = new JPanel();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentarea = getContentPane();

contentarea.setLayout(new BorderLayout());

contentarea.add(BildPanel, BorderLayout.CENTER);
contentarea.add(StartPanel, BorderLayout.CENTER); //Ueberschreibt BildPanel

Icon bild = new ImageIcon(„images/hinter.jpg“);
JLabel hg = new JLabel(bild);
BildPanel.add(hg); //fuege das Hintergrundbild dem StartPanel hinzu

setSize(bild.getIconWidth()+ 5, bild.getIconHeight()+ 5); //Fenstergroesse bild

startBut.addActionListener(start); //Lade den ActionListener start
StartPanel.add(startBut);

highBut.addActionListener(high); //Lade den ActionListener high
StartPanel.add(highBut);

endeBut.addActionListener(aus); //Lade den ActionListener aus
StartPanel.add(endeBut);

setVisible(true);
}

public static void main(String[] args) {
StartBild los = new StartBild();
}

//alle ActionListener
@Override
public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException(„Not supported yet.“);
}

ActionListener start = new ActionListener() //ActionListener aus
{
public void actionPerformed(ActionEvent e)
{
KeyConfig loslos = new KeyConfig(); //Spiel starten
System.out.println(„Start Javio“);
//loslos.run(); //Cannot call invokeAndWait from the event dispatcher thread
}
};

ActionListener aus = new ActionListener() //ActionListener aus
{
public void actionPerformed(ActionEvent e)
{
System.exit( 0 ); //Programm schliessen
}
};

ActionListener high = new ActionListener() //ActionListener aus
{
public void actionPerformed(ActionEvent e)
{
try {
HighScore hscore = new HighScore(); //Highscore starten
} catch (Exception ex) {
Logger.getLogger(StartBild.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(„Start Highscore“);
}
};
}

Ich hoff ihr könnt mir weiterhelfen.
MfG
Jackii

Hallo Jackii,

du kannst in dein ContentPane ja prinzipiell ein eigenes Panel setzen, welches du mit dann mit einem eigenen Layout versiehst und deinen Komponenten bestückst.

Als Panel kannst du das folgende ImagePanel verwenden:
http://www.java2s.com/Code/Java/Swing-JFC/Panelwithb…

Also im Prinzip:
ImagePanel panel = …
JFrame frame = new JFrame();
frame.getContentPane().add(panel);

panel.setLayoutManager(new BorderLayout());
panel.add(new JButton(„Eins“), BorderLayout.EAST);
panel.add(new JButton(„Zwei“), BorderLayout.WEST);

usw.

Ciao, Bill

Hallo Jacki892,

suche mal nach „JLayeredPane“. Damit kannst du verschiedene Ebenen zu schaffen, auf denen du Buttons, Bilder etc. darstellen lassen kannst.
Indem du die Darstellungsreihenfolge der Ebenen festlegst, kannst du genau definieren, welches
JPanel im Vordergrund liegt.

Gruß, Lendor

Hallo lendor.

Dies habe ich schon ausprobiert leider ohne erfolg…ich weiß nicht ob ich da was vertausch habe oder so…Kannst du mir ein Codebeispiel dafür geben??? am besten wo man buttons auf ein Hintergrundbild macht…daran bin ich am verzweifeln.

MfG
Jackii

Hallo Jackii,

sei mir nicht böse, aber wo ist denn jetzt deine Frage?
Ich finde keine. Du möchtest was machen mit einem Panel. Ja, okay, mach doch.
Also bitte sei so gut und konkretisiere deine Frage.
Und besonders hilfreich ist in solchen Fällen ein kleines selbständig compilierbares Beispiel.

Viele Grüsse
Torsten

Soweit ich jetzt aus dem Stehgreif weiß, kannst du dein Panel nicht transparent drüber legen. Aber warum benötigst du überhaupt zwei? Du kannst doch die Buttons direkt auf das Bild setzen.

Hallo,
da ich leider momentan wenig Zeit habe, würde ich Dich gerne an einen anderen Experten verweisen.

Ich habe es selber noch nicht ausprobiert,
Tut mir leid…

Lendor

Hi.

Wie kann ich denn die Buttons aufs Bild kriegen???
Kannst du mir vllt ein Codebeispiel schicken??

MfG
Jackii

Meine Frage ist ob es irgendwie möglich ist die Buttons auf das Bild zu bekommen.

Hier ist mal der Quellcode:
public class StartBild extends JFrame implements ActionListener {
JPanel StartPanel;
JPanel BildPanel;

private JButton startBut = new JButton(„Javio starten“);
private JButton highBut = new JButton(„Highscoreliste“);
private JButton endeBut = new JButton(„Javio beenden“);

public StartBild() {

BildPanel = new JPanel();
StartPanel = new JPanel();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentarea = getContentPane();

contentarea.setLayout(new BorderLayout());

contentarea.add(BildPanel, BorderLayout.CENTER);
contentarea.add(StartPanel, BorderLayout.CENTER); //Ueberschreibt BildPanel

Icon bild = new ImageIcon(„images/hinter.jpg“);
JLabel hg = new JLabel(bild);
BildPanel.add(hg); //fuege das Hintergrundbild dem StartPanel hinzu

setSize(bild.getIconWidth()+ 5, bild.getIconHeight()+ 5); //Fenstergroesse bild

startBut.addActionListener(start); //Lade den ActionListener start
StartPanel.add(startBut);

highBut.addActionListener(high); //Lade den ActionListener high
StartPanel.add(highBut);

endeBut.addActionListener(aus); //Lade den ActionListener aus
StartPanel.add(endeBut);

setVisible(true);
}

public static void main(String[] args) {
StartBild los = new StartBild();
}

//alle ActionListener
@Override
public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException(„Not supported yet.“);
}

ActionListener start = new ActionListener() //ActionListener aus
{
public void actionPerformed(ActionEvent e)
{
KeyConfig loslos = new KeyConfig(); //Spiel starten
System.out.println(„Start Javio“);
//loslos.run(); //Cannot call invokeAndWait from the event dispatcher thread
}
};

ActionListener aus = new ActionListener() //ActionListener aus
{
public void actionPerformed(ActionEvent e)
{
System.exit( 0 ); //Programm schliessen
}
};

ActionListener high = new ActionListener() //ActionListener aus
{
public void actionPerformed(ActionEvent e)
{
try {
HighScore hscore = new HighScore(); //Highscore starten
} catch (Exception ex) {
Logger.getLogger(StartBild.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(„Start Highscore“);
}
};
}

Hi Jackii.

Also, es wäre zu kompliziert dir eine „Schritt für Schritt“-Anleitung zu geben. Aber schau dir mal die Tutorials von Sun/Oracle zum Thema Panels an: http://docs.oracle.com/javase/tutorial/uiswing/compo…

Auch ganz gut/interessant: http://de.wikibooks.org/wiki/Java_Standard:_Grafisch…

Grüße,
Tom

Hallo,

werde mir das mal in Ruhe ansehen.
Aber bitte etwas Geduld.

Torsten

Hallo,

ich vermute mal du willst das Hintergrundbild angezeigt bekommen und die Buttons sollen darüber liegen …

Mit Layouts kenn ich mich nicht wirklich aus. Der Code unten müsste so funktionieren aber obs der beste Weg ist oder wie es schöner machbar ist kann ich nicht sagen… (Die MyPanel Klasse kommt von hier: http://www.tutorials.de/swing-java2d-3d-swt-jface/25… )

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class StartBild extends JFrame implements ActionListener {

class MyPanel extends JPanel {

private Image image;

MyPanel(Image image) {
this.image = image;
repaint();
}

public void paintComponent(Graphics g) {
g.drawImage(image, 0, 0, null);
}
}

MyPanel StartPanel;
//JPanel BildPanel;

private JButton startBut = new JButton(„Javio starten“);
private JButton highBut = new JButton(„Highscoreliste“);
private JButton endeBut = new JButton(„Javio beenden“);

public StartBild() {

//BildPanel = new JPanel();
StartPanel = new MyPanel(Toolkit.getDefaultToolkit().getImage(„images/hinter.jpg“));

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentarea = getContentPane();

contentarea.setLayout(new BorderLayout());

//contentarea.add(BildPanel, BorderLayout.CENTER);
contentarea.add(StartPanel, BorderLayout.CENTER); // Ueberschreibt
// BildPanel

Icon bild = new ImageIcon(„images/hinter.jpg“);
JLabel hg = new JLabel(bild);
//BildPanel.add(hg); // fuege das Hintergrundbild dem StartPanel hinzu

setSize(bild.getIconWidth() + 5, bild.getIconHeight() + 5); // Fenstergroesse
// bild

startBut.addActionListener(start); // Lade den ActionListener start
StartPanel.add(startBut);

highBut.addActionListener(high); // Lade den ActionListener high
StartPanel.add(highBut);

endeBut.addActionListener(aus); // Lade den ActionListener aus
StartPanel.add(endeBut);

setVisible(true);
}

public static void main(String[] args) {
StartBild los = new StartBild();
}

// alle ActionListener
@Override
public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException(„Not supported yet.“);
}

ActionListener start = new ActionListener() // ActionListener aus
{
public void actionPerformed(ActionEvent e) {
//KeyConfig loslos = new KeyConfig(); // Spiel starten
System.out.println(„Start Javio“);
// loslos.run(); //Cannot call invokeAndWait from the event
// dispatcher thread
}
};

ActionListener aus = new ActionListener() // ActionListener aus
{
public void actionPerformed(ActionEvent e) {
System.exit(0); // Programm schliessen
}
};

ActionListener high = new ActionListener() // ActionListener aus
{
public void actionPerformed(ActionEvent e) {
try {
//HighScore hscore = new HighScore(); // Highscore starten
} catch (Exception ex) {
//Logger.getLogger(StartBild.class.getName()).log(Level.SEVERE,
// null, ex);
}
System.out.println(„Start Highscore“);
}
};
}

Hallo nochmal,

eine Idee habe ich noch:

versuche mal auf dem oberen Button-JPanel ein setOpaque(false); zu setzen. Dies macht den JPanel durchsichtig.

Gruß, Lendor

Hallo,
hier ist mal ein funktionierendes Beispiel.
Den Rest musst du dann schon allein machen.
Learning by doing.
Quelle: http://www.java2s.com/Code/Java/Swing-JFC/Panelwithb… leicht modifiziert von mir.

Pfad und Dateiname des Bildes anpassen!!
Ich denke mal, damit kannst schon was anfangen

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageTest {

 public static void main(String[] args) {
 //ImagePanel panel = new ImagePanel(new ImageIcon( **PfadUndDateiname** ).getImage());
 ImagePanel panel = new ImagePanel(new ImageIcon("38205-1.jpg").getImage());
 JFrame frame = new JFrame();
 JButton button = new JButton("Was weiss ich");
 button.addActionListener(new java.awt.event.ActionListener() {
 @Override
 public void actionPerformed(java.awt.event.ActionEvent evt) {
 javax.swing.JOptionPane.showMessageDialog(null, 
 "Irgend eine Aktion", 
 "Info", 
 javax.swing.JOptionPane.INFORMATION\_MESSAGE);
 }
 });

 panel.setLayout(new java.awt.GridBagLayout());

 panel.add(button, new java.awt.GridBagConstraints());

 frame.getContentPane().add(panel);

 frame.setDefaultCloseOperation(JFrame.EXIT\_ON\_CLOSE);
 frame.pack();
 frame.setVisible(true);
 }

}

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);
 }



 @Override
 public void paintComponent(Graphics g) {
 g.drawImage(img, 0, 0, null);
 }

}

Viele Grüsse
Torsten

1 Like

schau mal hier -> http://www.java2s.com/Code/Java/Swing-JFC/Panelwithb…

das dürfte helfen.

Viel Spass noch

und hier ist kompilierbarer Code, der einen Button auf ein Bild platziert:
http://www.tutorials.de/swing-java2d-3d-swt-jface/24…

Hallo Jackii,
ich habe leider erst jetzt Zeit, aber du hast ja schon einige Antworten bekommen. Soll ich mich dennoch darum kümmern oder hat sich das erledigt?
Viel Grüße

tincian