Buttons auf ein Hintergrundbild(JFrame) setzen

Diskutiere Buttons auf ein Hintergrundbild(JFrame) setzen im Java Basics - Anfänger-Themen Bereich.
Fab1

Fab1

Hallo zusammen,

ich wollte mich ein bisschen mit den grafischen Möglichkeiten von Java befassen. Somit hab ich mir gedacht, dass ich für den Anfang erst einmal einen Button auf ein Hintergrundbild(JFrame) setze.

Hier traten allerdings ein paar Probleme auf.
Nach langen Versuchen hab ich dann mithilfe eines Forum Posts immerhin schon einmal ein Hintergrund Bild hinbekommen.

Nun möchte ich einen Button mit einem Icon auf das Hintergrundbild setzen. Hört sich eigentlich ja wirklich einfach an. Und trotzdem schaffe ich es nicht.

Java:
public class Testlauf extends JPanel{
    
	Image image;	
	
	public Testlauf(Image image){
		 
	    this.image = image;
	    
	} 
	
    public static void main (String[] args) {
    	

    	Testlauf hintergrund = new Testlauf(Toolkit.getDefaultToolkit().getImage("hintergrund.jpg"));
    	
    	JFrame frame = new JFrame("Test");
    	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	frame.setSize(810, 630);
    	frame.setLocation(400, 100);
    	
    	frame.add(hintergrund);

    	ImageIcon icon = new ImageIcon("button.jpg");
    	JButton button = new JButton(icon);
    	button.setPreferredSize(new Dimension(icon.getIconWidth(), icon.getIconHeight()));
    	
    	JPanel panel = new JPanel();
    	panel.add(button);
 
    	frame.add(panel);
    	
    	frame.setVisible(true);
    }
     
    protected void paintComponent(Graphics g){
 
    	g.drawImage(image,0,0,this);
    	
    }    
}
Was es noch zu sagen gibt. Die Bilder ".jpg" werden alle geladen, ich hab es nämlich schon geschafft das Hintergrundbild zu sehen und auch den Button. Nur leider nie beide gleichzeitig. Ich hab schon das Gefühl die mögen sich nicht ;(

Über eine Hilfestellung wäre ich sehr dankbar.
 
G

Gast2

super.paintComponent(g) musst du auf jedenfall noch aufrufen.
Vielleicht erledigt sich dein Problem dann schon.
 
E

eRaaaa

super.paintComponent(g) musst du auf jedenfall noch aufrufen.
Vielleicht erledigt sich dein Problem dann schon.
Vermutlich nicht, durch das letzte frame.add(panel) wird dein anderes Panel runtergeschmißen :)
Warum überhaupt ein zweites Panel? hintergrund.add(button); machts doch auch ?
 
Fab1

Fab1

Vermutlich nicht, durch das letzte frame.add(panel) wird dein anderes Panel runtergeschmißen :)
Warum überhaupt ein zweites Panel? hintergrund.add(button); machts doch auch ?
Anfangs hatte ich kein Panel. Nur da hat auch nicht funktioniert. Somit dachte ich mir ich mach mal eins und mach die PreferredSize vom Panel auf die Größe des Buttons bzw. Icons das hatte auch nicht funktioniert.
Ich teste es jetzt mal mit super.paintComponent(g) und ohne dem Panel.

Edit: Warum eigentlich 2. Panel? Ist doch nur eins ???:L

Danke soweit.
 
E

eRaaaa

Edit: Warum eigentlich 2. Panel? Ist doch nur eins ???:L

Danke soweit.
Testlauf extends JPanel{

hast du das auch mitgezählt? :)
Und genau das fliegt ja raus bzw wird durch das andere ersetzt! (dadurch wird dann eben auch dein paintComponent nicht aufgerufen)
 
Fab1

Fab1

Hoi,

also es funktioniert jetzt.

Das Problem war, ich hab den Button auf den JFrame gesetzt. Hätte ihn aber auf den hintergrund setzten müssen.

So ich bekomme nun die gewünschte Anzeige. Aber ich hätte noch eine Frage:

Was macht dieser Konstruktor genau? Hab den einfach 1 zu 1 von einem Forum übernommen.

Java:
(Toolkit.getDefaultToolkit().getImage("hintergrund.jpg")
Danke.

Edit: @ eRaaa nein das hab ich natürlich nicht mitgezählt^^
 
E

Einsal

Hallo,
ich bekomme es auch nicht hin einen JButton auf mein Hintergrundbild zu bekommen.
Ich möchte ein Text Spiel schreiben und habe schon den Start.
Doch ich weis nicht wo ich meine Button hinschreibe das sie gezeigt werden.
Mein Code:

Die GUI:

[/B]
[CODE]package Game;

import javax.swing.JButton;
import javax.swing.JFrame;

//import sun.awt.AWTAccessor.FrameAccessor;
public class GUI {


public static void main(String[] args) {



HauptFenster unserFenster = new HauptFenster();

unserFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
unserFenster.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
//unserFenster.setSize(1000, 1500);
unserFenster.setLocationRelativeTo(null);
unserFenster.setVisible(true);


}



}
[/CODE]
[B]



Mein HauptFenster:

[/B]
[CODE]package Game;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class HauptFenster extends JFrame implements ActionListener {

private JButton schliesen;
private JButton Start;
private JButton laden;
private JPanel Buttons;
//Image image = java.awt.Toolkit.getDefaultToolkit().createImage("C:\\Users\\Theristoph\\Documents\\Programme Java\\Game\\Wald.png");


public HauptFenster() {
super("Game");



Buttons = new JPanel();
Buttons.setVisible(true);
Buttons.setBounds(100, 100, 100, 100);
Buttons.setLayout(null);
add(Buttons);

/*BackroundStart BS = new BackroundStart();
BS.setBounds(0,0,1000,1500);
BS.setVisible(true);
Buttons.add(BS);*/


Start = new JButton ("START");
Start.setBounds(650, 250, 250, 70);
Start.addActionListener(this);
Font schriftart = new Font("Algerian", Font.BOLD , 30);
Start.setFont(schriftart);
Buttons.add(Start);



laden = new JButton ("LADEN");
laden.addActionListener(this);
laden.setBounds(650, 350, 250, 70);
laden.setFont(schriftart);
Buttons.add(laden);


schliesen = new JButton ("SCHLIESEN");
schliesen.addActionListener(this);
schliesen.setBounds(650, 450, 250, 70);
schliesen.setFont(schriftart);
Buttons.add(schliesen);


}
@Override
public void actionPerformed(ActionEvent e) {

if(e.getSource() == schliesen) {
this.dispose();
}
else if (e.getSource() == Start) {

NeuesFenster F = new NeuesFenster();
this.dispose();


}
else if (e.getSource() == laden) {

JOptionPane.showMessageDialog(getParent(), "Jetzt wird geladen");
}

}



}
[/CODE]


[B]


Mein Backround:

[/B]
[CODE]package Game;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class BackroundStart extends JPanel {

Image img;

public BackroundStart() {
setFocusable(true);
ImageIcon u = new ImageIcon("C:\\Users\\Theristoph\\Documents\\Programme Java\\Game\\Wald.png");
img = u.getImage();

}

@Override
public void paint (Graphics g) {



super.paint(g);
Graphics2D f2 = (Graphics2D)g;

f2.drawImage(img, 0, 0, getWidth(),getHeight(), this);


}

}
[/CODE]
[B]


Ist wahrscheinlich eine ziemlich triviale Frage, komme dennoch nicht weiter 😅
 
mihe7

mihe7

1. Packe keine 9 Jahre alten Leichen aus.
2. Überschreibe paintComponent und nicht paint.
 
VPChief

VPChief

leg doch ein JLabel mit dem Pfad als ContentPane fest und füge da deine Buttons hinzu.
1. Packe keine 9 Jahre alten Leichen aus.
2. Überschreibe paintComponent und nicht paint.
3.Bitte benutze den Java Code oder den Allgemeinen Code statt den Inliner Code, da wird man ja verrückt beim lesen
 
E

Einsal

tut mir leid, ich dachte das es so richtig ist. beim nächsten mal mache ich es richtig mit dem code :)
zum Thema Leichen, ich dachte man sollte lieber ein vorhandenen Thread nehmen, anstatt einen neuen zu öffnen. Denn wenn jmd, wie ich, Google durchforstet stößt man auf zig Threads und ich dachte man könnte das so minimieren. Werde ich beim nächsten mal auch besser machen 😅
Danke auf jedefall für die Antworten, werde es gleich probieren :D
 
E

Einsal

Habe ich nicht als Vorwurf sondern als Rat aufgenommen :)
Bräuchte aber dennoch erneut Hilfe.
Habe es jetzt hinbekommen, dass ich auf den neuen Fenster was ich erstelle der Hintergrund liegt und darauf ein Button ist.
Aber auf meinen Anfangs Fenster funktioniert es nicht.
Würdet ihr vielleicht noch einmal über meinen Code schauen und mir sagen was ich diesmal falsch mache 😅

Main
Code:
package Game;

import javax.swing.JFrame;

public class Main {

    public static void main(String[] args) {

        JFrame F = new Frame();

    }

}


HauptFesnter

Code:
package Game;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
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.JOptionPane;
import javax.swing.JPanel;

public class Frame extends JFrame implements ActionListener{
    
    private JLabel MH;
    private JPanel ST;
    private JButton Start;
    private JButton Laden;
    private JButton Schliessen;
    private Icon Picture2;
    
    public Frame() {
        super ("Game");
        
        
        setVisible(true);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
        setResizable(false);
        
        
        /*Picture2 = new ImageIcon("C:\\Users\\Theristoph\\Documents\\Programme Java\\Game\\Wald.png");
        MH = new JLabel(Picture2);
        add(MH);*/

        Font schriftart = new Font("Algerian", Font.BOLD , 30);
        
        
        
        ST = new JPanel();
        ST.setBackground(Color.CYAN);
        ST.setLayout(null);
        ST.setBounds(0, 0, 800, 800);
        add(ST);
        
        Start = new JButton("START");
        Start.setBounds(600, 350, 300, 50);
        Start.setFont(schriftart);
        Start.addActionListener(this);
        ST.add(Start);
        
        Laden = new JButton("LADEN");
        Laden.setBounds(600, 420, 300, 50);
        Laden.setFont(schriftart);
        Laden.addActionListener(this);
        ST.add(Laden);
        
        Schliessen = new JButton("SCHLIESSEN");
        Schliessen.setBounds(600, 490, 300, 50);
        Schliessen.setFont(schriftart);
        Schliessen.addActionListener(this);
        ST.add(Schliessen);
        
        
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        
        if(e.getSource() == Schliessen) {
            this.dispose();
        }
        else if (e.getSource() == Start) {
            
            NeuesFenster F = new NeuesFenster();
            this.dispose();
            
            
        }
        else if (e.getSource() == Laden) {
            
            JOptionPane.showMessageDialog(getParent(), "Jetzt wird geladen");
        }
        
    }   
}
Hier ist der Hintergrund nur grau

Fenster was sich öffnet wenn man den StartButton drückt

Code:
package Game;

import java.awt.Font;

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

public class NeuesFenster extends JFrame {
    
    private JLabel MHH;
    private JButton Start;
    
    
    public NeuesFenster() {
        super("Game");
    
    
        setVisible(true);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
        setResizable(false);
        //setLayout(new Border
        
        Font schriftart = new Font("Algerian", Font.BOLD , 30);
    
        Icon Picture = new ImageIcon("C:\\Users\\Theristoph\\Documents\\Programme Java\\Game\\Wald.png");
        MHH = new JLabel(Picture);
        add(MHH);
    
        Start = new JButton("START");
        Start.setBounds(600, 350, 300, 50);
        Start.setFont(schriftart);
        //Start.addActionListener(this);
        MHH.add(Start);
    
    
    }
}
Hier wird alles richtig angezeigt

Ich hoffe das ich dieses Mal mit den Code alles richtig gemacht habe, wenn nicht bitte bescheid sagen :D
 
VPChief

VPChief

1599052359222.png
Ich hab jetzt die Starten funktion raus, und eine main klasse gemacht die das aufruft, Deine Code Felder sind richtig
Klasse main:
Java:
package programme;

public class main {
   
public static void main(String[]args) {
    Frame frame = new Frame();  
    }

}
Java:
package programme;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class Frame extends JFrame implements ActionListener{
   
    private JLabel MH;
    private JPanel ST;
    private JButton Start;
    private JButton Laden;
    private JButton Schliessen;
    private Icon Picture2;
   
 
    public Frame() {
        super ("Game");
       
       
        setVisible(true);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
        setResizable(false);
       
       
        /*Picture2 = new ImageIcon("C:\\Users\\Theristoph\\Documents\\Programme Java\\Game\\Wald.png");
        MH = new JLabel(Picture2);
        add(MH);*/

        Font schriftart = new Font("Algerian", Font.BOLD , 30);
       
       
       
        ST = new JPanel();
        ST.setBackground(Color.CYAN);
        ST.setLayout(null);
        ST.setBounds(0, 0, 800, 800);
        add(ST);
       
        Start = new JButton("START");
        Start.setBounds(600, 350, 300, 50);
        Start.setFont(schriftart);
        Start.addActionListener(this);
        ST.add(Start);
       
        Laden = new JButton("LADEN");
        Laden.setBounds(600, 420, 300, 50);
        Laden.setFont(schriftart);
        Laden.addActionListener(this);
        ST.add(Laden);
       
        Schliessen = new JButton("SCHLIESSEN");
        Schliessen.setBounds(600, 490, 300, 50);
        Schliessen.setFont(schriftart);
        Schliessen.addActionListener(this);
        ST.add(Schliessen);
       
       
    }
   
    @Override
    public void actionPerformed(ActionEvent e) {
       
        if(e.getSource() == Schliessen) {
            this.dispose();
        }
        else if (e.getSource() == Start) {
           
            //
           
           
        }
        else if (e.getSource() == Laden) {
           
            JOptionPane.showMessageDialog(getParent(), "Jetzt wird geladen");
        }
       
    }  
   


}
Funktioniert das so bei dir?
 
J

JustNobody

Das setVisible(true) an das Ende setzen, wenn alle Elemente hinzugefügt wurden.

Oder alternativ - so Du nach der Anzeige noch Elemente hinzufügen musst: mittels repaint() die neue Darstellung erzwingen. (Teilweise ist auch ein revalidate Aufruf notwendig).
 
E

Einsal

Anhang anzeigen 14003
Ich hab jetzt die Starten funktion raus, und eine main klasse gemacht die das aufruft, Deine Code Felder sind richtig
Klasse main:
Java:
package programme;

public class main {
  
public static void main(String[]args) {
    Frame frame = new Frame(); 
    }

}
Java:
package programme;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class Frame extends JFrame implements ActionListener{
  
    private JLabel MH;
    private JPanel ST;
    private JButton Start;
    private JButton Laden;
    private JButton Schliessen;
    private Icon Picture2;
  

    public Frame() {
        super ("Game");
      
      
        setVisible(true);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
        setResizable(false);
      
      
        /*Picture2 = new ImageIcon("C:\\Users\\Theristoph\\Documents\\Programme Java\\Game\\Wald.png");
        MH = new JLabel(Picture2);
        add(MH);*/

        Font schriftart = new Font("Algerian", Font.BOLD , 30);
      
      
      
        ST = new JPanel();
        ST.setBackground(Color.CYAN);
        ST.setLayout(null);
        ST.setBounds(0, 0, 800, 800);
        add(ST);
      
        Start = new JButton("START");
        Start.setBounds(600, 350, 300, 50);
        Start.setFont(schriftart);
        Start.addActionListener(this);
        ST.add(Start);
      
        Laden = new JButton("LADEN");
        Laden.setBounds(600, 420, 300, 50);
        Laden.setFont(schriftart);
        Laden.addActionListener(this);
        ST.add(Laden);
      
        Schliessen = new JButton("SCHLIESSEN");
        Schliessen.setBounds(600, 490, 300, 50);
        Schliessen.setFont(schriftart);
        Schliessen.addActionListener(this);
        ST.add(Schliessen);
      
      
    }
  
    @Override
    public void actionPerformed(ActionEvent e) {
      
        if(e.getSource() == Schliessen) {
            this.dispose();
        }
        else if (e.getSource() == Start) {
          
            //
          
          
        }
        else if (e.getSource() == Laden) {
          
            JOptionPane.showMessageDialog(getParent(), "Jetzt wird geladen");
        }
      
    } 
  


}
Funktioniert das so bei dir?


Damit habe ich den Hintergrund nur in einer Farbe, aber ich möchte das Bild ja als Hintergrund haben und meine JButtons drauf.

Das setVisible(true) an das Ende setzen, wenn alle Elemente hinzugefügt wurden.

Oder alternativ - so Du nach der Anzeige noch Elemente hinzufügen musst: mittels repaint() die neue Darstellung erzwingen. (Teilweise ist auch ein revalidate Aufruf notwendig).
wenn ich setVisible(true) ans Ende mache, ändert sich auch nichts.

wie ich das genau mit repaint() erzwingen kann weis ich leider nicht und was revalidate ist, weis ich nicht, damit beschäftige ich mich jetzt mal :)

Danke erstmal für die Antworten :D
 
Thema: 

Buttons auf ein Hintergrundbild(JFrame) setzen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben