Avatar billede VC1 Seniormester
11. maj 2022 - 18:21 Der er 7 kommentarer

Dynamisk 'resize' background til java application

Jeg har prøvet at sætte en baggrund ind på min application, desværre følger den ikke ''frame-size''. Den er blot ''linket'' til et hjørne og viser så mere eller mindre af billedet efter justeringen.

Jeg ville gerne have det altid er 1:1 af hele billedet, og så det bare er størrelsen som ændres, men kan ikke umildbart finde en metode der kan dette.

Nogen der har en god ide?

Pt. ser min kode sådan her ud.

public void gameStart(){

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);

        JLabel label = new JLabel();
        label.setIcon((new ImageIcon("C:...\\Images\\pandemic.jpg")));
        label.setSize(500,500);
        frame.add(label, BorderLayout.WEST);
        frame.setVisible(true); //Show image and background at startup

        JPanel panel1 = new JPanel();

        panel1.setBackground(Color.red);

        panel1.setPreferredSize(new Dimension(100,100));

        frame.add(panel1, BorderLayout.NORTH);
Avatar billede arne_v Ekspert
11. maj 2022 - 18:58 #1
Så vidt jeg kan google mig til er det et kendt problem med JLabel.

Mulig løsning:

https://tips4java.wordpress.com/2008/10/12/background-panel/

link synes ikke at virke men der er en kopi her:

https://github.com/silverweed/toncc/blob/master/BackgroundPanel.java
Avatar billede VC1 Seniormester
11. maj 2022 - 19:31 #2
Tak Arne, jeg har godt haft kigget på den og prøvet ganske kort, men den får jeg aldrig til at fungere. Det niveau er jeg slet ikke på, at jeg kan gennemskue koden og justere til mit behov.

Nogle andre har skrevet om en component listener, så det vil jeg se om giver mere mening for mig.

Men tak.
Avatar billede arne_v Ekspert
11. maj 2022 - 20:12 #3
Så vidt jeg kan se så skal den ikke tilrettes.

Man indsætter:
        JPanel back = new BackgroundPanel(ImageIO.read(new File("/oliver.jpg")));
        getContentPane().add(back);

i sin kode og erstatter:

getContentPane().add(...);

med:

back.add(...);
Avatar billede arne_v Ekspert
11. maj 2022 - 20:15 #4
Jeg kan se at jeg tilbage i 2014 lavede en løsning til et spørgsmål her på eksperten.dk:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class BackGroundImage extends JFrame {
    private static final long serialVersionUID = 1L;
    private JButton btn;
    public BackGroundImage() {
        setTitle("Background image example");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(400, 400));
        setContentPane(new JPanel() {
            private static final long serialVersionUID = 1L;
            protected void paintComponent(Graphics g) {
                try {
                    g.drawImage(ImageIO.read(new File("/oliver.jpg")).getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH), 0, 0, null);
                } catch(Exception ex) {
                    JOptionPane.showMessageDialog(BackGroundImage.this, ex.getMessage());
                }
            }
        });
        getContentPane().setLayout(new BorderLayout());
        btn = new JButton("Do not click here");
        btn.addActionListener(evt -> JOptionPane.showMessageDialog(BackGroundImage.this, "You should not have clicked here!"));
        getContentPane().add(btn, BorderLayout.SOUTH);
        pack();
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new BackGroundImage();
                f.setVisible(true);
            }
        });
    }
}


Jeg kan absolut intet huske om tankerne bag den løsning.

:-)
Avatar billede VC1 Seniormester
11. maj 2022 - 20:35 #5
Tak arne, jeg sætter pris på din input, men igen virker det som kode der ikke er helt logisk for mig, alene det at jeg kan se en syntaks med }); så skaber det mere forvirring end gavn for mig, for som jeg har lært det burde dette ikke være muligt, men bliver alligevel godkendt :P

Jeg må rode med billedet og ændre dets størrelse manuelt så det bare passer med en fuldskærm og lade det være ved det.

Men tak.
Avatar billede arne_v Ekspert
11. maj 2022 - 21:11 #6
De anynonyme klasser forvirrer dig.

De er faktisk også ret unikke for Java.

Men det er bare en anonym klasse som implementerer et givet interface.

Her er et eksempel med en navgiven klasse:

package may;

public class Demo1 {
    // interface
    public static interface Fun {
        public void doit();
    }
    // class that implements Fun
    public static class FunOne implements Fun {
        @Override
        public void doit() {
            System.out.println("Demo 1 here");
        }
    }
    // test Fun instance
    public static void test(Fun f) {
        f.doit();
    }
    public static void main(String[] args) {
        Fun o = new FunOne();
        test(o);
    }
}


samme med en anonym klase:

package may;

public class Demo2 {
    // interface
    public static interface Fun {
        public void doit();
    }
    // test Fun instance
    public static void test(Fun f) {
        f.doit();
    }
    public static void main(String[] args) {
        test(new Fun() { // anonymous class that implements Fun
            @Override
            public void doit() {
                System.out.println("Demo 2 here");
            }
        });
    }
}


Der er en vis tradition for at bruge disse ved Swing programmering.

Siden Java 8 har de været forældede i tilfælde af at interfacet kun havde en metode idet man så kan bruge en lambda.

package may;

public class Demo3 {
    // interface
    @FunctionalInterface
    public static interface Fun {
        public void doit();
    }
    // test Fun instance
    public static void test(Fun f) {
        f.doit();
    }
    public static void main(String[] args) {
        test(() -> System.out.println("Demo 3 here")); // lambda that implements Fun (requires Java 8+)
    }
}
Avatar billede arne_v Ekspert
12. maj 2022 - 01:25 #7
Og hvis man er lidt pedantisk så skal FunOne naturligvis ikke være static, hvis den skal matche den anonyme klasse, men ....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester