[java] ustawienie obrazka jak background

0

Co trzeba zrobić,żeby ustawić obrazek jako tło?
Proszę o wyrozumiałość,jestem początkująca.

0

Nieco paradoksalnie, tło w postaci obrazka dodajesz na końcu.

JLabel  bg=new JLabel(new ImageIcon(nazwaObrazka));
bg.setOpaque(true);
add(bg);
0

To nie o to mi chodziło.Coś takiego tworzy jLabel i ustawia Icon, Mi chadziło o to :żeby było po prostu tło na którym da się układać jButton, JTextField itp.
Ciągle proszę o wyjaśnienie mojego problemu :(

0

Wypróbowałaś? To się właśnie tak robi. Może Cię zmyliło ImageIcon? Plik graficzny, którego nazwę przekazujesz do ImageIcon może być dowolnej wielkości.

import javax.swing.*;
import java.awt.*;

public class Tlo extends JFrame
{
    public static void main(String[] args)
    {
        new Tlo();
    }
    //------------------------
    public Tlo()
    {
        setLayout(null);
        setPreferredSize(new Dimension(750,406));

        JButton b=new JButton("Abrakadabra");
        b.setBounds(10,10,120,25);
        add(b);

        b=new JButton("Hokus-pokus");
        b.setBounds(10,110,120,25);
        add(b);

        JTextField tf=new JTextField(10);
        tf.setBounds(10,210,120,25);
        add(tf);

        JLabel bg=new JLabel(new ImageIcon("jakiś obrazek o rozmiarach 750 na 406"));
        bg.setOpaque(true);
        bg.setBounds(0,0,750,406);
        add(bg);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }
}
0

ewentualnie nadpisać metodę paint(Graphics g):

public void paint(Graphics g){
    Graphics2D g2d=(Graphics2D)g; //rzutowanie do Graphics2D, daje możliwość skalowania
    float s=(float)(getWidth())/(float)(bg.getWidth(this)); //skaluj by wypełnić na szerokość
    g2d.scale(s,s); //skaluj do szerokości
    g2d.drawImage(bg, null, this); //rysuj tło
    paintComponents(g); //rysuj komponenty
}

Możesz też pominąć skalowanie:

public void paint(Graphics g){
    g.drawImage(bg, null, this); //rysuj tło
    paintComponents(g); //rysuj komponenty
}

Albo pobawić się z tillowaniem:

public void paint(Graphics g){
    for(int x=0; x<getWidth(); x+=bg.getWidth(this))
        for(int y=0; y<getHeight(); y+=bg.getHeight(this))
            g.drawImage(bg, x, y, this); //rysuj tło
    paintComponents(g); //rysuj komponenty
}

Albo tak jak wyżej: labelem, tylko stosując LayeredPane. Ale nadpisanie painta chyba najlepsze

0

Należy nadpisywać metodę paintComponent, nie paint.
W przeciwnym wypadku rysowanie będzie się odbywać w złym wątku.

http://download.oracle.com/javase/6/docs/api/javax/swing/JComponent.html#paintComponent%28java.awt.Graphics%29

paintComponent zawsze powinien na początku wywołać super.paintComponent(g);

protected void paintComponent(Graphics g) {
super.paintComponent(g);
/* reszta */
}

0

Niestety wy mi nie pomogliście, ale problem rozwiązałam z forum//www.java-tips.org/java-se-tips/javax.swing/wrap-a-swing-jcomponent-in-a-background-image.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1