Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Sehe die GUI vor LAuter Code nicht ;)

Empfohlene Antworten

Veröffentlicht

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) {

        }

    }


}

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)

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

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!

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.

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.