Zum Inhalt springen

Sehe die GUI vor LAuter Code nicht ;)


Empfohlene Beiträge

Geschrieben

Nabend,

Ich Habe mich an einer Kleinen Anwendung versucht, Ich will das MVC Pattern umsetzen habe die Klassen und alles schön sortiert. Nun bin ich mit meiner GUI und der Anwendung fertig so das ich mir die GUI Anzeigen lassen wollte.

Also Klasse mit Main geschrieben und Programm Läuft los.

Ich nach rechts, gui nach links ;)

der Frame wird gezeichnet aber der Panel anscheinend darin nicht.

Vielleicht wird auch nur der inhalt nicht gezeichnet, da habe ich aber kein plan :confused:

Ich habe repaint und (!oder!) validate getestet, border um das Panel versucht zu legen, aber nie irgendwas im Frame angezeigt bekommen!

Hat einer von euch einen Plan, es gibt keine Fehlermeldung! Methoden werden ausgeführt!

package view.questionnaire;


import java.awt.Color;

import java.awt.Dimension;

import java.awt.FlowLayout;

import java.awt.Font;

import java.awt.event.WindowListener;

import java.util.Observable;

import java.util.Observer;


import javax.swing.AbstractAction;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.UIManager;

import javax.swing.UnsupportedLookAndFeelException;

import javax.swing.border.Border;

import javax.swing.border.LineBorder;


import model.questionnaire.IObservableModel;

import controller.questionnaire.QuestionnaireController;

import domain.questionnaire.RichJCheckBox;

import domain.questionnaire.event.Actions;

import domain.questionnaire.event.LastQuestionEvent;

import domain.questionnaire.exerciseContent.Answer;

import domain.questionnaire.exerciseContent.Exercise;


public class QuestionnaireGUI implements Observer{


    private int numberOfQuestions;

    private int frameCenterY, frameCenterX;

    private int centerPanelHeight, centerPanelWidth;

    private int componentHeight = 60;

    private int componentWidth = 900;

    private int locationX, locationY;


    private Dimension minimumSize;


    private String buttonText = "Weiter";


    private JFrame jFrame = null;


    private JPanel centerPanel = null;

    private JPanel contentPanel = null;

    private JPanel bottomPanel = null;


    private JButton jButton = null;


    private RichJCheckBox jCheckBox = null;


    private Font font = new Font("Arial", 1, 20);


    private JLabel questionLab ,sheetlab;


    private Exercise exercise = null;


    private IObservableModel model = null;

    private QuestionnaireController controller = null;


    public QuestionnaireGUI(IObservableModel model, QuestionnaireController controller){

        this.model = model;

        this.controller = controller;


        this.model.addObserver(this);


        minimumSize = new Dimension(componentWidth, componentHeight);


        lookAndFeelSetzen();


        /*Frame erzeugen*/

        jFrame = new JFrame("Quiz");

        jFrame.setLayout(null); // Layout des Fensters festgelegen

        jFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);//Fenstergröße Vollbild

        jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//nur das Aktuelle Fenster schließen

        jFrame.addWindowListener((WindowListener) this.controller);//Listener fürs Fenster

        jFrame.setFont(font);



        /*Frame Mittelpunkt bestimmen*/

        frameCenterY = jFrame.getSize().height / 2;

        frameCenterX = jFrame.getSize().width / 2;


        /*Panel erzeugen auf dem die Fragen angezeigt werden*/

        centerPanel = new JPanel();

        centerPanel.setLayout(new FlowLayout());

        centerPanel.setMinimumSize(minimumSize);

        centerPanel.setPreferredSize(minimumSize);

        centerPanel.setBackground(Color.green);


        centerPanelWidth = componentWidth + 10;// Breite des Haupt Panels 

        centerPanelHeight = (5 * componentHeight);// Init Höhe (Höhe einer Standart Aufgabe)


        locationX = frameCenterX - (centerPanelWidth / 2);

        locationY = frameCenterY - (centerPanelHeight/ 2);


        //TODO

//        System.out.println("GUI: 98 " + locationX + " und " + locationY);

        //TODO


        centerPanel.setLocation(locationX, locationY);

        centerPanel.setVisible(true);

        jFrame.add(centerPanel);



        /*Fragen Label anzeigen*/

        questionLab = new JLabel();

        questionLab.setFont(font);


        jFrame.setVisible(true);

    }


    @Override

    public void update(Observable o, Object arg) {

        if ( arg instanceof Exercise){

            this.exercise = (Exercise) arg;

            paintExercise(exercise);

        } else if (arg instanceof Integer){

            int argument = ((Integer) arg).intValue(); 

            numberOfQuestions = argument;

        } else if (arg instanceof LastQuestionEvent){

            LastQuestionEvent lastQuestionEvent = (LastQuestionEvent) arg;

        }


    }


    private void paintExercise(Exercise exercise) {


//        centerPanel.removeAll();


        if (bottomPanel == null){

            createBottomPanel();

        }


        /*Frage hinzufügen*/

//        System.out.println("GUI: Frage " + exercise.getQuestion().getQuestion());

        questionLab.setText( exercise.getQuestion().getQuestion() );

        contentPanel = new JPanel();

        contentPanel.setMinimumSize( minimumSize );

        contentPanel.add( questionLab );

        contentPanel.setVisible(true);

        centerPanel.add( contentPanel );


        /*Antwortmöglichkeiten hinzufügen*/

        int indexID = 0;

        for (Answer answer : exercise.getAnswers()) {

//            System.out.println("GUI: Antwortmöglichkeit " +answer.getAnswer());

            jCheckBox = new RichJCheckBox(answer.getAnswer(), indexID);

            jCheckBox.setPreferredSize(minimumSize);

            jCheckBox.setSelected(false);

            jCheckBox.setVisible(true);


            contentPanel = new JPanel();

            contentPanel.setMinimumSize( minimumSize );

            contentPanel.add( jCheckBox );

            contentPanel.setVisible(true);

            centerPanel.add( contentPanel );


            indexID++;

        }


        centerPanel.add( bottomPanel );

        centerPanel.revalidate();

        centerPanel.validate();


//        jFrame.setPreferredSize(new Dimension(2 * frameCenterX, 2* frameCenterY));

        jFrame.repaint();

//        System.out.println("GUI: paintExercise - Paint");


    }


    private void createBottomPanel() {

        /*Info Panel erzeugen*/

        bottomPanel = new JPanel();

        bottomPanel.setSize(componentWidth, componentHeight);

        bottomPanel.setMinimumSize(minimumSize);

        /*Info Text erzeugen und einfügen*/

        sheetlab = new JLabel();

        sheetlab.setText(exercise.getQuestionNumber() + " beantwortet von " + numberOfQuestions);

        bottomPanel.add(sheetlab);

        /*Weiter Button erzeugen und einfügen*/

        jButton = new JButton();

        jButton.setText(buttonText);

        jButton.setActionCommand(Actions.NEXT.toString());

        jButton.addActionListener((AbstractAction)controller);

        bottomPanel.add(jButton);


    }


    private void lookAndFeelSetzen() {

        try {

            if (System.getProperty("os.name").toString().equals("Mac OS X")) {

                UIManager.setLookAndFeel("apple.laf.AquaLookAndFeel");

            } else {

                UIManager

                        .setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");

            }

        } catch (ClassNotFoundException e1) {

        } catch (InstantiationException e1) {

        } catch (IllegalAccessException e1) {

        } catch (UnsupportedLookAndFeelException e1) {

        }

    }


}

Geschrieben

Ich Ändere die Frage!!

Wo habe ich den Fehler in der Positionierung des Panels? Bzw. in festsetzen der Größe? Das CenterPanel Soll mittig sitzen und wird leider während der Laufzeit in der Höhe geändert (noch nicht implementiert)

Geschrieben

Hallo.

Vorweg: Bitte poste hier einen vernünftigen Testcase. Es ist lästig, wenn man erstmal alles auskommentieren muss, was entweder keine Rolle spielt oder nicht kompiliert wird.

Zu deinem Problem: Die Variablen, die dafür relevant sind, sind die Breiten, die du berechnest und die Positionierung. Mach da mal Testausgaben und schau sie dir an, dann siehst du was falsch ist:


System.out.println("PanelMaße: " + + centerPanelWidth + " und " + centerPanelHeight);

System.out.println("FrameCenterX: " + + frameCenterX + " FrameCenterY: " + frameCenterY);

System.out.println("Position des Panels: " + + locationX + " und " + locationY);

PanelMaße: 910 und 300

FrameCenterX: 0 FrameCenterY: 0

Position des Panels: -455 und -150

Geschrieben

Danke für deine Antwort,

Irgendwie blöde von mir :rolleyes:

Wenn man, so wie ich, mit einem null Layout arbeitet sollte man die Größe des Panels auch entsprechend mit setSize() angeben!

Geschrieben

Wenn man, so wie ich, mit einem null Layout arbeitet sollte man die Größe des Panels auch entsprechend mit setSize() angeben!

Mit setSize() änderst du aber nur die Größe, nicht die Position (was primär der Fehler war). Wenn du mit dem null-Layout arbeitest, benutz am besten die setBounds() Methode - da deckst du sowohl Größe als auch Positionierung ab.

Hinsichtlich der Eleganz bei der Verwendung der verschiedenen Layout Managern scheiden sich die Geister.

Geschrieben

Die Positionierung war soweit ok.

Geändert an der Positionierung habe ich auch nichts, funzt jetzt aber alles!

Mein Fehler war des nicht setzen der Panelgröße und das zuspäte anzeigen des frames mit setVisible.

setBounds funzt auch gut, ich nehme aber lieber den anderen weg ;)

Generell würde ich lieber einen Manager nutzen, der kann mir aber hier nicht helfen, da ich Leerräume haben werde und die mir Bekannten Layoutmanager würden entweder die Position oder die größe des Panels nicht so setzen wie ich es gern hätte. Die Manager füllen immer die Leerräume des Framein dem sie die Größen und Positionen der inhalte anpassen.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...