Jave swing overly benutzten.

XWing

Mitglied
Hallo,
ich versuche mich gerade an einem Grafischem Taschenrechner, dabei orientiere ich mich an dem Windows tachenrechern was für funktionen ich haben möchte. Gerade möchte ich ein neues Panel erstellen um als overlay zu fungieren der über meinen beiden anderen Panels liegt. In diesem Panel soll man mehrere Buttons clicken können. Und dazu soll es nur angezeigt werden wenn ein bestimmter button geklicked wird. Gerade funktioniert das mit dem hzeigen und verstecken, nur das er kein overlay macht sondern es unter meinen panels anzeigt. Ich hab versucht als layout overlay zu benutzen was aber anscheinend nicht Funktioniert.

Das Wäre mein code: (Ich habe 3Klassen eine Main, eine für GUI und eine für Logic daswegen ist nicht alles da)

Java:
package Taschenrechner;

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

public class GUI{

    //defenierung
    JPanel panel;
    JFrame frame;
    JTextField Result;
    private Logic logic;
    public JLabel EndResult;
    public boolean Framesetter = false;
    private JPanel moreoptionsPanel;

    //methode für die erstellung des JFrames und der Panel
    public GUI(){
        //erstellung des JFrames
        frame = new JFrame();
        frame.setSize(350,500);

        //erstellung des main pannels mit styling und
        // angaben zur border, positionierung etc..
        panel = new JPanel();
        panel.setLayout(new GridLayout(2,1));
        panel.setBackground(Color.lightGray);
        panel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));

        //hinzufügung der 2 restlichen 2 Panels auf dem main panel
        panel.add(Anzeige(), BorderLayout.NORTH);

        //aufrung der logic klasse um die click events zu handeln
        Logic logic = new Logic(Result, EndResult, this);

        panel.add(Buttons(logic),BorderLayout.CENTER);

        moreoptionsPanel = Moreoptions();

        // das main panel wird auf das frame gesetzt
        frame.add(panel, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Calculator");

        frame.setVisible(true);
    }

    // methode die die erstellung des jbutton panels und die erstellung
    // der buttons handelt
    public JPanel Buttons(ActionListener listener){
        //erstellung des panels warauf die buttons liegen
        JPanel ButtonPanel = new JPanel();
        ButtonPanel.setLayout(new GridLayout(5,4));

        //string die die namen der buttons enthält
        String[] buttons = {
                "More", "%", "C", "+",
                "7", "8", "9", "-",
                "4", "5", "6", "*",
                "1", "2", "3", "/",
                "", "0", "", "="
        };

        // For loop der die buttons added unddirket auf das panel setzt
        for (String text : buttons) {
            JButton button = new JButton(text);
            button.setPreferredSize(new Dimension(50, 50));
            button.addActionListener(listener); // Attach the listener for handling button clicks
            ButtonPanel.add(button); // Add button to the panel
        }

        //gibt das button panel zurück für die benutzung
        return ButtonPanel;
    }

    public JPanel Moreoptions(){
        JPanel moreoptions = new JPanel();
        moreoptions.setLayout(new OverlayLayout(moreoptions));
        moreoptions.setBackground(Color.LIGHT_GRAY);
        moreoptions.setVisible(Framesetter);
        JButton test = new JButton("click me");
        moreoptions.add(test);
        return moreoptions;
    }
    //methode die die erstellung des anzeige panels und die dazugehörigen
    //variabeln erstellt und direkt aufs panel setzt.
    public JPanel Anzeige(){
        //erstellung des panels
        JPanel Solution = new JPanel();
        Solution.setLayout(new BorderLayout());
        //erstellung des labels der das end ergbniss anzeigt
        EndResult = new JLabel("0");
        EndResult.setHorizontalAlignment(SwingConstants.RIGHT);
        //erstellung des text fields das die geklicked buttons anzeigt
        Result = new JTextField(26);
        Result.setEditable(false);
        Result.setPreferredSize(new Dimension(350,100));
        Result.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        // hinzufügung des jlabels und des textfields auf das panel
        Solution.add(Result);
        Solution.add(EndResult,BorderLayout.NORTH);
        return Solution;
    }
    public void toggleMoreOptionsPanel() {
        Framesetter = !Framesetter;
        if (Framesetter) {
            // Add the more options panel when showing
            panel.add(moreoptionsPanel, BorderLayout.EAST);
        } else {
            // Remove the more options panel when hiding
            panel.remove(moreoptionsPanel);
        }
        frame.revalidate(); // Refresh the frame layout
        frame.repaint();
    }
}

Ich nehme gerne jede hilfe entgegen auch gerne tips wie ich meinen code verbessern könnte. (ich mach gerade zum ersten mal ein GUI also nicht wundern wenn ales zusammengerust aussieht)
 
Ich nehme gerne jede hilfe entgegen auch gerne tips wie ich meinen code verbessern könnte. (ich mach gerade zum ersten mal ein GUI also nicht wundern wenn ales zusammengerust aussieht)
Hier ein Link zu einem Beispiel wie man so einen Rechner machen kann.
https://www.java-forum.org/thema/ja...eld-anzeigen-lassen-kann.202078/#post-1350713

Die GUI ist fertig. Es fehlt nur die Klasse für den Rechner die Logik.
Schau dir den Code an , lade dir das Beispiel herunter. Falls dich die Aufgabe interessiert kann ich gerne bei dem erstellen der Logik auch weiterhelfen.
😉
 
Zuletzt bearbeitet:
Die logik hab ich schon gemacht. An sich funktioniert das Taschenrechner auch komplett. Ich möchte jetzt nur noch ein extra Panel haben was layered ist und die anderen Panels Überlappt. Und in diesem Überlapendem Panel sollen noch mehr Buttons sein.
 
Das habe ich mir schon gedacht. Das Problem bei deinem Code ist, dass du den eigentlichen Rechner ( Logik ) nicht von der Anzeige und der Eingabe trennst. Dein gezeigter Codeteil beinhaltet nicht die Logik, die aber gleichzeitig als Listener für den Click auf den Button "more" dient. Normalerweise sollte deine Eingabe auf den Click reagieren und sich dem entsprechend ändern.
Ich habe dir deswegen den obigen Link gegeben, weil dort gezeigt wird, wie man so eine Trennung im Code machen kann.
 

Zurück
Oben