2009-09-23 18 views

Antwort

20

Es gibt kein Konzept für ein "Hintergrundbild" in einem JPanel, also müsste man einen eigenen Weg schreiben, um ein solches Feature zu implementieren.

Eine Möglichkeit, dies zu erreichen, wäre, die Methode paintComponent zu überschreiben, um bei jeder Aktualisierung der JPanel ein Hintergrundbild zu zeichnen.

Zum Beispiel würde man eine JPanel, Unterklasse und ein Feld hinzufügen, das Hintergrundbild zu halten, und überschreiben Sie die paintComponent Methode:

public class JPanelWithBackground extends JPanel { 

    private Image backgroundImage; 

    // Some code to initialize the background image. 
    // Here, we use the constructor to load the image. This 
    // can vary depending on the use case of the panel. 
    public JPanelWithBackground(String fileName) throws IOException { 
    backgroundImage = ImageIO.read(new File(fileName)); 
    } 

    public void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    // Draw the background image. 
    g.drawImage(backgroundImage, 0, 0, this); 
    } 
} 

(. Über Code wurde nicht geprüft)

Die folgender Code könnte verwendet werden, um die JPanelWithBackground in eine JFrame hinzuzufügen:

JFrame f = new JFrame(); 
f.getContentPane().add(new JPanelWithBackground("sample.jpeg")); 

In diesem Beispiel der ImageIO.read(File) Methode wurde verwendet, um die externe JPEG-Datei einzulesen.

+1

Dies beantwortet die Frage nicht ganz. Es fügt ein Hintergrundbild in ein Panel ein, fügt es dann aber einfach in das normale Layout ein. Die Frage war, wie man einen Hintergrund auf einen Rahmen hinter anderen Komponenten legt. – Boann

+0

Würde es Probleme verursachen, wenn Sie es als ImageObserver "null" geben würden? – georgiaboy82

1

Hier ist ein weiterer schneller Ansatz ohne zusätzliche Platte zu verwenden.

JFrame f = new JFrame("stackoverflow") { 
    private Image backgroundImage = ImageIO.read(new File("background.jpg")); 
    public void paint(Graphics g) { 
    super.paint(g); 
    g.drawImage(backgroundImage, 0, 0, null); 
    } 
}; 
+2

Ich habe diese Technik nicht richtig gefunden. Das Bild zeichnet manchmal über die Kindkomponenten oder wird manchmal von dem normalen Rahmenhintergrund abgedeckt, wenn dies nicht der Fall ist. – Boann

+0

Ja, dies funktioniert nicht mit untergeordneten Komponenten. –

5

Dies ist leicht durch den Austausch des Rahmens Inhaltsbereich mit einem JPanel getan, was Ihr Bild zeichnet:

try { 
    final Image backgroundImage = javax.imageio.ImageIO.read(new File(...)); 
    setContentPane(new JPanel(new BorderLayout()) { 
     @Override public void paintComponent(Graphics g) { 
      g.drawImage(backgroundImage, 0, 0, null); 
     } 
    }); 
} catch (IOException e) { 
    throw new RuntimeException(e); 
} 

In diesem Beispiel wird auch das Layout zu Border des Panels des Standard Inhaltsbereich Layout anzupassen.

(Wenn Sie Probleme haben, das Bild zu sehen, könnte man setOpaque(false) auf einigen anderen Komponenten aufrufen müssen, so dass Sie in den Hintergrund durchschauen können.)

0
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
class BackgroundImageJFrame extends JFrame 
{ 
    JButton b1; 
    JLabel l1; 
public BackgroundImageJFrame() 
{ 
setTitle("Background Color for JFrame"); 
setSize(400,400); 
setLocationRelativeTo(null); 
setDefaultCloseOperation(EXIT_ON_CLOSE); 
setVisible(true); 
/* 
One way 
-----------------*/ 
setLayout(new BorderLayout()); 
JLabel background=new JLabel(new ImageIcon("C:\\Users\\Computer\\Downloads\\colorful design.png")); 
add(background); 
background.setLayout(new FlowLayout()); 
l1=new JLabel("Here is a button"); 
b1=new JButton("I am a button"); 
background.add(l1); 
background.add(b1); 

// Another way 
setLayout(new BorderLayout()); 
setContentPane(new JLabel(new ImageIcon("C:\\Users\\Computer\\Downloads \\colorful design.png"))); 
setLayout(new FlowLayout()); 
l1=new JLabel("Here is a button"); 
b1=new JButton("I am a button"); 
add(l1); 
add(b1); 
// Just for refresh :) Not optional! 
    setSize(399,399); 
    setSize(400,400); 
    } 
    public static void main(String args[]) 
    { 
    new BackgroundImageJFrame(); 
} 
} 
0

wenn Sie NetBeans verwenden Sie hinzufügen können, Ein Jlabel zum Rahmen und durch Eigenschaften ändert sein Symbol zu Ihrem Bild und entfernt den Text. dann verschiebe das Jlabel an den unteren Rand des Jframes oder irgendein Inhaltsfenster durch den Navigator

Verwandte Themen