Bild in GUI

recess

Mitglied
Hallo, wir besprechen zurzeit Swing/GUI/JLabel ect.
Ich möchte einen Adventskalender programmieren, wo rechts 24 Türchen (4x6) und links daneben ein Bild zu sehen ist
Die 24 Türchen sollen als JButtons realisiert werden und dann mit Hilfe von ActionListener überprüft werden.
Soll dann in etwa so aussehen:

attachment.php






Mein derzeitiger Stand:

Java:
import javax.swing.JFrame;


public class Test1 {

	public static void main (String [] args){

		JFrame jf= new La();
		
		
	}
}


Java:
package Main;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;







public class La extends JFrame {

	JLabel text;
	JButton button;
	ImageIcon icon1;
	ImageIcon icon2;


	public La(){
		setVisible(true);
		setSize(500,300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setLayout(null);


		for (int z=0; z<6;z++){


			for (int i=1; i<5;i++){
				int zahl= i+(4*z);
				button = new JButton(zahl+"");
				button.setBounds(230+(i*50),(35*(z+1)),50,25);
				add(button);
			}
		}
		icon1 = new ImageIcon(getClass().getResource("src/Main/weihnachten6.png"));
		text= new JLabel(icon1);
		add(text);
	}

}
Allerdings werden die 24 Türchen irg wie zu weit auseinander ausgegeben und das Bild wird auch nicht angezeigt. Kann mir jemand sagen , was ich falsch mache? Is die Bildimplementierung so richtig?

Sollte ich am besten ein BorderLayout machen?
Wie geht das genau? Das was ich dazu gefunden ahbe ist:
Java:
String[] adjust = { BorderLayout.NORTH,
BorderLayout.EAST,
BorderLayout.SOUTH,
BorderLayout.WEST,
BorderLayout.CENTER};
for (int i = 0; i < component.length; ++i) {
add(adjust[i % adjust.length], component[i]);
}
Weiß aber nicht wie ich das auf meinen Fall anwenden soll :/
 

Anhänge

  • 3aqsajsi.jpg
    3aqsajsi.jpg
    76,2 KB · Aufrufe: 134
Zuletzt bearbeitet von einem Moderator:
Hi,

es wäre wohl besser, wenn du hier auf das absolute Layout verzichten würdest. Ich denke du sparst dir dabei sehr viel Arbeit.

Für die Kästchen würde sich beispielsweise sehr gut das GridLayout eignen. Hierbei hat jedes Feld im Gridlayout die gleiche Größe, was bei dir ja wohl der Fall wäre.

Das Bild sieht man nicht, weil für das Bild also dem JLabel text keine Koordinaten oder Größe festgelegt hast.
Aber wenn du einen Layoutmanager verwenden würdest, dann hättest auch auch diese Problem nicht.

Du hast ja das BorderLayout angesprochen. Ich bin der Meinung, dass man mit diesem LM schon die meisten Sachen realisieren kann, da man den Layoutmanager natürlich auch verschachteln kann. Also am besten schaust du dir einfach mal ein paar Layoutmanager an und die Beispiele dazu und wenn dann noch ein paar Fragen auftreten, dann weißt du ja wo du uns findest.
 
Java:
import java.awt.*;
import java.net.*;
import java.text.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;

public class Advent implements ActionListener {

    private JButton doorButton;
    private JLabel label;

    public Advent(){
        JFrame frame = new JFrame("Adventskalender");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DateFormat formatter = new SimpleDateFormat("EEEE 'der' d. MMMM yyyy");

        JPanel calendarPanel = new JPanel(new GridLayout(0, 4, 2, 2));

        for (int i = 0; i < 24; i++){
            doorButton = new JButton(String.valueOf(i+1));
            doorButton.setFocusPainted(false);
            doorButton.setFocusable(false);
            doorButton.addActionListener(this);
            calendarPanel.add(doorButton);
        }

        Icon icon = null;
        try {
            icon = new ImageIcon(new URL("http://www.animierte-gifs.net/data/media/359/animierte-weihnachtsmann-bilder-101.gif"));
        } 
        catch(Exception e) {
            e.printStackTrace();
        }
        label = new JLabel(icon);
        label.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
        
        JLabel dateLabel = new JLabel("Heute ist "+formatter.format(new Date()));
        dateLabel.setHorizontalAlignment(JLabel.CENTER);
        dateLabel.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
        
        frame.add(label, BorderLayout.CENTER);
        frame.add(calendarPanel, BorderLayout.EAST);
        frame.add(dateLabel, BorderLayout.SOUTH);
        
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    
    public void actionPerformed(ActionEvent e) {
        JButton source = (JButton)e.getSource();
        if(source.getText().equals("1")) {
            System.out.println("1");
        }
        else if(source.getText().equals("2")) {
            System.out.println("2");
        }
        //usw.
    }
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Advent advent = new Advent();
            }
        });
    }
}
 

Anhänge

  • Advent.png
    Advent.png
    32,4 KB · Aufrufe: 73
Hallo,

habe auch einen Adventskalender programmiert und in Eclipse tut alles wunderbar. Jetzt möchte ich den aber weitergeben, sprich so haben damit er auf Rechnern ohne Eclipse o. ä. läuft und damit nicht irgendwelche Laien was am Code ändern und danach funktioniert nichts mehr ... (ihr kennt das sicher 🙂 )

Habe schon etwas geforscht und gefunden, dass ich dafür eine .jar Datei erstellen muss. Das habe ich auch hinbekommen, allerdings fehlen da dann die Bilder. Weiß jemand von euch, wie ich das hinbekomme, dass die ebenfalls in der .jar Datei sich befinden?

Hab es schon versucht, wenn die Bild-Dateien im src Ordner des Projektes lagen oder eben einfach nur im Projektorder (also da wo man bin und src eben sieht - auf der Ebene).
 
Musst du beim Export angeben. Bei einer Runnable Jar sollte er das automatisch machen, bei einen Jar-Export kannst du auswählen was du reinwillst. Dazu musst du die Dateien ins selbe Verzeichnis wie die *.java-Dateien legen um relativ dazu zu laden, und (sofern du es nicht per Eclipse gemacht hast) wärend das Programm nicht läuft das Package im Explorer markieren und F5 drücken, damit er weiß dass sich was geändert hat. Dann sollte er dir die Bilder auch im Explorer anzeigen. (Außer du hast es natürlich ausgeblendet.)

Natürlich musst du dann auch eine Lademethode benutzen, die die Bilder aus der Jar läd. Falls du eine andere verwendest (z. B. ImageIcon mit String-Parameter) müssen die Bilder direkt im Projektverzeichnis und im Verzeichnis der Jar liegen.
 
Hallo,

vielen Dank für deine Antwort. Also das mit der Runnable Jar habe ich schon versucht und alle möglichen Varianten - leider alle ohne Erfolg.

Was für eine Lademöglichkeit müsste ich verwenden damit es funktioniern könnte? Bisher mache ich es so:
Java:
labP = new JLabel(new ImageIcon ("advent4.jpg"));
hier liegt das Bild auf der Ebene wo man auch die "bin" und "src" Ordner sieht. Sprich direkt im Order des JavaProjekts.

Variante 2:
Java:
labP = new JLabel(new ImageIcon ("src/weihnachtszeit.jpg"));
hier liegt das Bild, wie ersichtlich im src-Ordner.

Ach ja hab die Variable natürlich vorher initialisiert mit JLabel labP = new JLabel();
Hab die zwei Varianten oben in der switch-case drin, damit ich verschiedene Bilder habe - je nach Tag...

Habe ich die Bilder richtig gespeichert oder muss ich die irgendwie verschieben? Also in Eclipse erscheinen sie nirgends.
 
Sorry dumme Frage jetzt, aber woher weiß ich wo der jar-Ordner erstellt wird? Der ist ja am Anfang noch nicht vorhanden.

Weiß nicht ob das einen Unterschied bei dem Export macht, aber ich habe einen Mac mit Mountain Lion drauf (also Mac OS X 10.8.2)
 
Die musst doch eben mitgeben. Bei vielen Programmen hast du ja auch nicht nur die ausführbare Datei sondern viele andere Ressourcen. (Wobei ich einen Mac noch nie verwendet habe)
Alternativ lädst du direkt aus der jar über den ClassLoader:

Java:
new JLabel(new ImageIcon(getClass().getResource("advent4.jpg")));

In diesem Fall wird relativ zur Klasse geladen.
 
Hab deinen Code eingefügt aber jetzt funktioniert gar nichts mehr. Bekomme eine NullPointerException - was wahrscheinlich daran liegt, dass der Pfad nicht gefunden wurde.
 
Liegt die Datei im selben Verzeichnis, wie die java-Datei? Wenn du im Package Explorer aktualisierst sollte Eclipse es von dort automatisch zu den class-Dateien kopieren.
 
Vielen vielen Dank, jetzt funktioniert es. Das Problem war wohl, dass ich die Bilder nicht in Eclipse sah und somit konnte er die auch nicht mit dazupacken. Das refresh wirkt wahre Wunder 🙂
 

Zurück
Oben