Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht?

_brina205

Mitglied
Ich muss bei einer Aufgabe für mein Studium einen Pizza Konfigurator erstellen:
Meine Hauptklasse sieht so aus:
Java:
package view;

import Model.PizzaSize;
import Model.PizzaTopping;

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

public class PizzaKonfigurator extends JFrame {

    private JComboBox pizzaSize;
    private  ImageIcon pizza;

    public PizzaKonfigurator() {
        super("Pizzakonfigurator");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(500, 400);

        //Menubar
        MyMenuBar myMenuBar = new MyMenuBar();
        setJMenuBar(myMenuBar);

        //ContentPane aufteilen
       // Container contentpane = getContentPane();
        PizzaKonfigPanel konfigPanel1 = new PizzaKonfigPanel(new GridBagLayout());
        PizzaKonfigPanel konfigPanel2 = new PizzaKonfigPanel(new BorderLayout());
        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, konfigPanel1, konfigPanel2);
        splitPane.setResizeWeight(0.4);
        splitPane.setEnabled(false);
       //  contentpane.add(splitPane);

        //Linke Seite Layout
        //Label Größe
        GridBagConstraints gbc1 = new GridBagConstraints();
        gbc1.gridx = 0;
        gbc1.gridy = 0;
        gbc1.anchor = GridBagConstraints.WEST;
        gbc1.insets = new Insets(1, 1, 1, 20);
        konfigPanel1.add(new JLabel("Größe: "), gbc1);

        //ComboBox Größe
        pizzaSize = new JComboBox(PizzaSize.values());
        pizzaSize.setSelectedIndex(3);
        GridBagConstraints gbc2 = new GridBagConstraints();
        gbc2.gridx = 1;
        gbc2.gridy = 0;
        gbc2.anchor = GridBagConstraints.NORTHWEST;
        konfigPanel1.add(pizzaSize, gbc2);

        //Label Belag
        GridBagConstraints gbc3 = new GridBagConstraints();
        gbc3.gridx = 0;
        gbc3.gridy = 1;
        gbc3.insets = new Insets(1, 1, 1, 20);
        konfigPanel1.add(new JLabel("Belag: "), gbc3);

        //Checkboxen Belag
        GridBagConstraints gbc4 = new GridBagConstraints();
        gbc4.gridx = 1;
        gbc4.gridy = 1;
        gbc4.anchor = GridBagConstraints.NORTHWEST;
        for (PizzaTopping topping : PizzaTopping.values()) {
            konfigPanel1.add(new JCheckBox(topping.toString()), gbc4);
            gbc4.gridy++;
        }

        //Rechte Seite
        //In BorderSouth FlowLayout
        PizzaKonfigPanel southPanel = new PizzaKonfigPanel(new FlowLayout());
        konfigPanel2.add(southPanel, BorderLayout.SOUTH);

        //Bild
        PizzaKonfigPanel centerpanel = new PizzaKonfigPanel();
        konfigPanel2.add(centerpanel, BorderLayout.CENTER);
        pizza = new ImageIcon("C:\\Users\\sabri\\IdeaProjects");
        JLabel bild = new JLabel(pizza);
        centerpanel.add(bild);

        //Buttons Fertig und Beenden
        southPanel.add(new JButton("Fertig"));
        southPanel.add(new JButton("Beenden"));
    }
}

[CODE lang="java" title="Main-Klasse"]package view;

public class main {

public static void main(String[] args) {
PizzaKonfigurator konfigurator = new PizzaKonfigurator();
konfigurator.setVisible(true);
}
}[/CODE]

Ich habe versucht es mit einem SplitPane darzustellen, aber sobald ich dann die main starte, ist die Fläche komplett leer und man sieht keine Komponenten außer der MenuBar, aber mit dem ContentPane, was ich hier jetzt auskommentiert habe, sieht man alles, ich sitze schon seit Stunden dran und habe mit etliche COde-Beispiele angeschaut, aber ich finde meinen Fehler nicht...

Das Bild sieht man übrigens auch nicht, falls man mir da auch noch einen Tipp geben könnte 😀
 
Du musst das SplitPane eben in deinem Frame setzen. Dazu reicht ein add(splitPane); Der JFrame hat (sofern nicht explizit geändert) ein BorderLayout und somit landet die Komponente im CENTER. Man kann es natürlich auch ausschreiben: add(splitPane, BorderLayout.CENTER);

Und dein absoluter Pfad gibt nur ein Verzeichnis an? Oder hat das Bild keine Dateiendung?
 
Du musst das SplitPane eben in deinem Frame setzen. Dazu reicht ein add(splitPane); Der JFrame hat (sofern nicht explizit geändert) ein BorderLayout und somit landet die Komponente im CENTER. Man kann es natürlich auch ausschreiben: add(splitPane, BorderLayout.CENTER);

Und dein absoluter Pfad gibt nur ein Verzeichnis an? Oder hat das Bild keine Dateiendung?
Oh Mann, stimmt, das hat gefehlt 🤦‍♀️ Der Pfad war nicht ganz richtig, du hattest richtig, jetzt hats funktioniert, vielen Dank für Deine Hilfe 🙂
 
Java:
PizzaKonfigPanel centerpanel = new PizzaKonfigPanel();
        konfigPanel2.add(centerpanel, BorderLayout.CENTER);
        pizza = new ImageIcon("C:/Users/sabri/IdeaProjects/PizzaBild.jpg");
        pizza.setImage(pizza.getImage().getScaledInstance(200,200, Image.SCALE_DEFAULT));
        JLabel bild = new JLabel(pizza);
        centerpanel.add(bild);

Wie schaffe ich es jetzt, dass das Bild nicht oben klebt sondern in der Mitte und dass es größer wird, sobald ich das Fenster größer ziehe?
 
Ein möglicher Ansatz: Lade das Bild EINMAL beim Formularstart und halte es in Originalgröße in einer Variable.
Dein JLabel kriegt einen Component-Listener. im Resize-Abschnitt wird ausgewertet, wie groß dein JLabel im Vergleich zum BIld ist und der Streckfaktor entsprechend berechnet. Dann wird dem Label in der selben Methode das skalierte BIld zugewiesen. Vielleicht gibt's aber auch was vorgefertigtes, damit man nicht jedesmal neu zuweisen muss.
ODER du weist das Bild dem Label gar nicht zu, sondern lässt es während der Paint-Methode reinzeichnen, jedesmal entsprechend Labelgröße neu skaliert. Damit umgehst du Insets usw.
Letzteres funktioniert mit jeder Komponente, da sie keine Icon-Property haben muss.
 

Neue Themen


Zurück
Oben