gui-Problem: nur 1 Button von 3en wird angezeigt

Status
Nicht offen für weitere Antworten.

Kiola

Mitglied
Hey,

ich hätte gerne ein ganz normales Fenster mit einem Hintergrundbild, auf dem drei Buttons postioniert sind..
Jedoch funktioniert das nicht.

Hier mein Code:

Code:
package implementation;
import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import javax.swing.*;

public class Test{
	
	private JLabel jLabelBild;
	private final JFrame jFrame;
	private JPanel p2;
	private JButton schliessen, links, rechts;
	private URL u;
	
    public Test(){  
    	jFrame= new JFrame("... Test ...");
    	jFrame.setPreferredSize(new Dimension(500,400));
    	Dimension resolution = Toolkit.getDefaultToolkit().getScreenSize();
    	u= getClass().getClassLoader().getResource("Bilder/anleitung1.png");
    	jLabelBild = new JLabel();
    	jLabelBild.setIcon(new ImageIcon(u));

    	schliessen = new JButton("schließen");
    	links = new JButton("<<");
    	rechts = new JButton(">>");

    	schliessen.addActionListener(new ActionListener() {
			    public void actionPerformed (ActionEvent e) { 
			    	jFrame.dispose();
			    }
		});
    	
    	links.addActionListener(new ActionListener() {
		    public void actionPerformed (ActionEvent e) { 
		    }
    	});
    	
    	rechts.addActionListener(new ActionListener() {
		    public void actionPerformed (ActionEvent e) { 
		    	URL u= getClass().getClassLoader().getResource("Bilder/anleitung2.png");
		    	jLabelBild.setIcon(new ImageIcon(u));
		    	jFrame.add(jLabelBild);
		    	jFrame.add(p2,BorderLayout.SOUTH);
		    	jFrame.repaint();
		    }
    	});
    	
    	p2= new JPanel(new GridBagLayout());
    	GridBagConstraints c = new GridBagConstraints();

    	c.insets = new Insets(300,0,12,85);
    	p2.add(links,c);
    	c.insets = new Insets(300,0,12,0);
		p2.add(schliessen,c);
		c.insets = new Insets(300,85,12,0);
		p2.add(rechts,c);

		jFrame.add(jLabelBild, BorderLayout.NORTH);
		jFrame.add(p2,BorderLayout.SOUTH);
		jFrame.repaint();
		jFrame.setResizable(false);
		jFrame.setVisible(true);
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jFrame.setLocation((resolution.width - jFrame.getSize().width)/4, 
					(resolution.height - jFrame.getSize().height)/4);
		jFrame.pack();
    }
    public static void main(String[] args) {
		new Test();
	}
}


wenn ich die Zeile jFrame.add(jLabelBild, BorderLayout.NORTH); weglasse, werden die Buttons ganz normal angezeigt. Doch so wird nur ein Button angezeigt und die anderen beiden erst wenn ich mit der Maus drüber fahre.
Ich hatte auch schon versucht den Hintergrund, anstatt in ein Label zu setzen mit der paintComponent zu zeichnen, aber das funktioniert leider noch weniger.

Hat einer eine Idee, was ich falsch machen könnte?

Viele Grüße
 
Kiola hat gesagt.:
ich hätte gerne ein ganz normales Fenster mit einem Hintergrundbild, auf dem drei Buttons postioniert sind.
Die Buttons können wir in einen "overlayPanel" tun und die Bilder in einen JPanel mit CardLayout, etwa so:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CardDemo extends JFrame implements ActionListener {
    private JPanel imageComponents;
    private JButton right, left, close;
    private CardLayout cl;
    private ImageIcon[] images;
    public CardDemo() {
        super("Card Demo");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(500, 400);
        setLocationRelativeTo(null);
        images = new ImageIcon[2];
        images[0] = loadImage("Bilder/anleitung1.png");
        images[1] = loadImage("Bilder/anleitung2.png");

        //"mainPanel" with OverlayLayout:
        JPanel mainPanel = new JPanel() {
            @Override
            public boolean isOptimizedDrawingEnabled() {
                return false;
            }
        };
        mainPanel.setLayout(new OverlayLayout(mainPanel));
        getContentPane().add(mainPanel);

        //"overlayPanel" containing "controlPanel":
        JPanel overlayPanel = new JPanel(new BorderLayout());
        overlayPanel.setOpaque(false);
        JPanel controlPanel = new JPanel();
        controlPanel.setPreferredSize(new Dimension(0, 50));
        controlPanel.setOpaque(false);
        controlPanel.add(left = new JButton("<<"));
        controlPanel.add(close = new JButton("schließen"));
        controlPanel.add(right = new JButton(">>"));
        overlayPanel.add(controlPanel, BorderLayout.SOUTH);

        //add "overlayPanel" first:
        mainPanel.add(overlayPanel);

        //then add the image components:
        mainPanel.add(getImageComponents());
        
        //add listener to buttons:
        right.addActionListener(this);
        left.addActionListener(this);
        close.addActionListener(this);
    }
    private ImageIcon loadImage(String path) {
        return new ImageIcon(getClass().getClassLoader().getResource(path));
    }
    private JPanel getImageComponents() {
        cl = new CardLayout();
        imageComponents = new JPanel(cl);
        for (int index = 0; index < images.length; index++) {
            imageComponents.add(new JScrollPane(new JLabel(images[index])), "");
        }
        return imageComponents;
    }
    public void actionPerformed(final ActionEvent e) {
        Object source = e.getSource();
        if (source.equals(right)) {
            cl.previous(imageComponents);
        } else if (source.equals(left)) {
            cl.next(imageComponents);
        } else if (source.equals(close)) {
            dispose();
        }
    }
    public static void main(final String[] args) {
        Runnable gui = new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }
                new CardDemo().setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}
 
Hey,

das ist ja toll. Wollte es nämlich ursprünglich mit ScrollBar machen, aber das hat auch nicht in Verbindung mit Hintergrundbild funktioniert.
Werde mir den Code mal zu Gemüte führen.
Danke!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben