Navigationsprobleme

Vivyel

Mitglied
Hallo zusammen,

ich habe folgende Java Klassen in jeder befindet sich ein Button mit einem actionlistener:

- eine JFrame Klasse ( im Package hauptmenue) Klassenname:hauptmenue
- zwei JPanel Klassen (im package mathe) Klassennamem: matheEinstellungen und matheMenue

ich habe die buttons innerhalb der JPanel Klassen in ein JPanel gepackt.

navigation soll über Button erfolgen.

Navigation von JPanel Klasse zu JFrame Klasse(hauptmenue):

hauptmenue hm = new hauptmenue();
hm.setVisible(true);
hm.setSize(800, 600);
hm.repaint();

Problem:
Anstatt das JFrame im vorhandenen Fenster zu laden öffnet sich durch den Befehl setVisible ein neues Fenster. Mit remove leer er mir nur das alte Fenster.

Wie muss ich den Befehl ändern, damit er den Inhalt des JFrame ins vorhandene Fenster lädt anstatt ein neues zu öffnen?


Navigation von JPanel Klasse zu Jpanel Klasse

hier habe ich das Problem, dass ich nicht weis, wie ich das JPanel von der einen Klasse in die andere importieren bzw. adden kann. ich habe es mit new wie oben probiert, aber ohne erfolg.

hier habs ich folgendermaßen versucht:
matheEinstellungen me = new matheEinstellungen();
getContentPane().removeAll();
getContentPane().add(me);
me.setVisible(true);
me.setSize(800, 600);
me.repaint();

getcontent zeigt mir java im code als fehler an, wenn ichs dann mit getroot versuche, ist es im code in ordung aber beim abspielen mit der Kosole erhalte ich die fehlermeldung unknown source beim drücken des Buttons
Anmerkungen:
Bei der Navigaton von JFrame Klasse zu JPanel Klasse habe ich keine Probleme, da funktiert alles einwandfrei.

Ich probier seit ein paar Stunden auf die Lösung zu kommen. Durch google hab ich leider auch nichts gefunden:(

Bitte helft mir. Die Lösung ist bestimmt total simpel nur ich komm nicht drauf:(

Liebe Grüße
Vivyel
 
Zuletzt bearbeitet:

Vivyel

Mitglied
PS zu navigaton von JPanel Klasse zu Jpanel Klasse
wenn ich es mit new probiere kann ich die klasse matheEinstellungen nicht importieren!
 

Hellosager

Aktives Mitglied
Es fällt mir etwas schwer nachzuvollziehen, was du beschreiben willst.
Jedenfalls kannst du mit „new" nur neue Objekte erzeugen, die sind wie frisch geschlüpft, demnach kannst du so auch nicht auf bereits bestehende Objekte zugreifen bzw. damit arbeiten.

Zum Problem mit dem neuen Fenster:
Wie oben beschrieben, erzeugt
Java:
hauptmenue hm = new hauptmenue();
ein neues Objekt vom Typ hauptmenue.
Das heißt, dass du jetzt zwei dieser Objekte(also Frames) hast.

Um nur auf dem ersten zu arbeiten, empfiehlt es sich ein Panel auf die ContentPane zu adden auf dem du arbeiten kannst. So mache ich das zumindest meist du könntest das Panel auch weglassen musst allerdings mit Contentpane und nicht mit dem Frame arbeiten um deinem Frame Inhalt zu geben.

Java:
Container c = hm.getContentPane();
speichert dir die Contentpane in C ab.
Auf c kannst du dann deine Buttons adden und falls einer gedrückt wird schreibst du in den ActionListener des Buttons
Java:
C.removeAll();
/*
Hier jetzt der Code,
der c nach deinen wünschen ändert
*/
hm.revalidate();


Ich hoffe das war erst mal hilfreich genug für dein erstes Problem, dein zweites Anliegen konnte ich leider nicht ganz nachvollziehen. Vielleicht postet du mal deine ganzen JPanel-Klassen, am besten mit den Code-Tags....
 

Vivyel

Mitglied
danke für deine hilfe, leider ist das nicht ganz die lösung die ich benötige. Für mich ist es wichtig, dass die navigation zwischen den klassen funktioniert, da ich die klassen noch um einige komponenten erweitern werde. Wenn ich alles in eine packe ist es mir persönlich zu unübersichtlich. ich habs bisher so als testvariante

Hauptmenü Klasse:
Java:
package hauptmenue;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JButton;

import mathe.matheMenue;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class hauptmenue extends JFrame {

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    hauptmenue frame = new hauptmenue();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public hauptmenue() {
        setBounds(100, 100, 450, 300);
        getContentPane().setLayout(null);
        setSize(800,600);
    
        JButton btnmatheMenue = new JButton("Mathemenü");
        btnmatheMenue.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            
                matheMenue mm = new matheMenue();
                getContentPane().removeAll();
                getContentPane().add(mm);
                mm.setVisible(true);
                mm.setSize(800, 600);
                mm.repaint();
            }
        });
        btnmatheMenue.setBounds(105, 174, 314, 98);
        getContentPane().add(btnmatheMenue);

    }
}

MatheMenü Klasse:
Java:
package mathe;

import hauptmenue.hauptmenue;

import javax.swing.JPanel;
import javax.swing.JButton;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class matheMenue extends JPanel {
    /**
     * Create the panel.
     */
    public matheMenue() {
        setSize(800,600);
        setLayout(null);
    
        JPanel panelmatheMenue = new JPanel();
        panelmatheMenue.setBounds(0, 0, 800, 600);
        add(panelmatheMenue);
        panelmatheMenue.setLayout(null);
    
        JButton btnNewButton = new JButton("Einstellungen");
        btnNewButton.setBounds(180, 216, 227, 71);
        panelmatheMenue.add(btnNewButton);
    
        JButton btnhauptmenue = new JButton("hauptmen\u00FC");
        btnhauptmenue.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                hauptmenue hm = new hauptmenue();
            //  getRootPane().removeAll();
                //getRootPane().add(hm);
                hm.setVisible(true);
                hm.setSize(800, 600);
                hm.repaint();
                hm.revalidate();
            }
        });
        btnhauptmenue.setBounds(39, 376, 204, 85);
        panelmatheMenue.add(btnhauptmenue);
    }
}

und die letzte matheEinstellungen:
Java:
package mathe;

import javax.swing.JPanel;
import javax.swing.JButton;

public class matheEinstellungen extends JPanel {
    /**
     * Create the panel.
     */
    public matheEinstellungen() {
        setLayout(null);
        setSize(800,600);
    
        JPanel panelmatheEinstellungen = new JPanel();
        panelmatheEinstellungen.setBounds(0, 0, 800, 600);
        add(panelmatheEinstellungen);
        panelmatheEinstellungen.setLayout(null);
    
        JButton btnNavigation = new JButton("navigation?gegl\u00FCckt?");
        btnNavigation.setBounds(179, 86, 405, 197);
        panelmatheEinstellungen.add(btnNavigation);
    }
}

die navigation soll in die jeweilige klasse erfolgen dessen name auf dem button steht. die letzte ist nur da um zu sehen, ob die JPanel zu Jpanel navigation funktioniert.

wichtig ist mir, dass nur der inhalt des Fensters sich verändert und kein neues fenster geöffnet wird.

Meine beiden Hauptprobleme sind also:
1. wie kann ich bei der Navigation von JPanel zu JFrame verhindern, dass sich ein neues Fenster öffnet, trotz new? Oder kann ich das JFrame in das JPanel anders importieren ohne new operator?

2. wie kann ich von der JPanel klasse matheMenue in die JPanel klasse matheEinstellungen navigieren? ich habs mit dem Befehl add in kombination mit get probiert, leider vergeblich. Oder kann ich die klasse i-wie importieren?
 
Zuletzt bearbeitet von einem Moderator:

Hellosager

Aktives Mitglied
Habe dein Problem mal für dich gelöst.
Du kannst dir anschauen was bei mir anders als bei dir ist.
Kurz gesagt musst du mit der Referenz auf die ContentPane arbeiten.
Ich musste eine neue Klasse erstellen für den Startbildschirm also dein Hauptmenü glaube ich.
Habe jetzt nicht geschaut ob du noch irgendwo Fehler hast, sondern ich hab das jetzt nur zum Laufen gebracht.

Klasse hauptmenue:
Java:
import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.JFrame;

        public class hauptmenue extends JFrame {
            private Container c;
          
            /**
             * Launch the application.
             */
            public static void main(String[] args) {
                EventQueue.invokeLater(new Runnable() {
                    public void run() {
                        try {
                            hauptmenue frame = new hauptmenue();
                            frame.setVisible(true);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
            }

            /**
             * Create the frame.
             */
            // Konstruktor
            public hauptmenue() {
                this.c = getContentPane();
                c.setLayout(null);
                setBounds(100, 100, 450, 300);
                setSize(800,600);
           
                new StartBildschirm(c);

            }
        }

Klasse matheMenue:
Java:
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;

public class matheMenue extends JPanel {
    /**
     * Create the panel.
     */
    public matheMenue(Container c) {
        setSize(800,600);
        setLayout(null); 
        c.setLayout(null);
   
        JButton btnNewButton = new JButton("Einstellungen");
        btnNewButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                new matheEinstellungen(c);
            }
        });
        btnNewButton.setBounds(180, 216, 227, 71);
        add(btnNewButton);
   
        JButton btnhauptmenue = new JButton("hauptmen\u00FC");
        btnhauptmenue.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
             new StartBildschirm(c);
            }
        });
        btnhauptmenue.setBounds(39, 376, 204, 85);
        add(btnhauptmenue);
    }
}

Klasse matheEinstellungen:
Java:
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;

public class matheEinstellungen extends JPanel {
    /**
     * Create the panel.
     */
    public matheEinstellungen(Container c) {
        c.removeAll();      
        setLayout(null);
        setBounds(0, 0, 800, 600);      
        JButton btnNavigation = new JButton("navigation?gegl\u00FCckt?");
        btnNavigation.setBounds(179, 86, 405, 197);
        btnNavigation.addActionListener(new ActionListener() {      
            public void actionPerformed(ActionEvent e) {
                // Hier kannst du erneut irgendwo wohin navigieren
            }
        });
      
        add(btnNavigation);      
        c.add(this);
        c.revalidate();
        c.repaint();
    }
}


und meine selbsterstelle Klasse StartBildschirm:
Java:
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;

public class StartBildschirm extends JPanel{
    public StartBildschirm(Container c){
        c.removeAll();
      
        JButton btnmatheMenue = new JButton("Mathemenü");
        btnmatheMenue.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
           
                matheMenue mm = new matheMenue(c);
                c.removeAll();
                c.add(mm);
                mm.setSize(800, 600);
                mm.repaint();
            }
        });
        btnmatheMenue.setBounds(105, 174, 314, 98);
       c.add(btnmatheMenue);
       c.repaint();
       c.revalidate();
    }
}
 
Zuletzt bearbeitet von einem Moderator:

Vivyel

Mitglied
Vielen Dank für die Lösung in der Testklasse funktioniert sie einwandfrei.
Sobald ich sie auf meine bestehende anwenden will fangen bereits die Probleme an.

der container funktioniert nicht bei meinen händisch erstellten buttons.

die folgendermaßen aussehn:
Java:
    //-----------------------------------------------------------------------------------------Button  REKORDE
        private JButton getbtnmatheRekorde() {
            if (btnmatheRekorde == null) {
                btnmatheRekorde = new JButton("Rekorde");
                btnmatheRekorde.setBounds(32, 304, 136, 56);
                btnmatheRekorde.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        new StartBildschirm(c);
                    }
                });
            }
            return btnmatheRekorde;
    }

dazu hab ich noch einen: private JButton btnmatheRekorde; // unter public class matheMenue
und ein: add(getbtnmatheRekorde()); // unter public matheMenue

gesetzt.

die navigation funktioniert auf diese weise leider nicht mehr. der button bleibt gedrückt.
den container in die get reinzuschreiben hilft auch nicht. ist es überhaupt möglich den container auf meinen rekordbutton anzuwenden?

PS. ich wollte gerade ein neues JPanel zur Navigation hinzufügen. jedoch funktioniert es auch nicht. ich habe es ebenfalls in der testklasse versucht.

im matheMenue habe ich die navigation zum hauptmenü durch new matheRekord(c); ersetzt, das programm navigiert nicht dorhin. ich kann auch keinen fehler bei meiner klasse feststellen. hier der code:

Java:
public class matheRekorde extends JPanel {
    /**
     * Create the panel.
     */
    public matheRekorde(Container c) {
          //--------------------------------------------C!!!!!!!!!
          c.setLayout(null);
            setLayout(null);
            setBounds(0, 0, 800, 600);
          
            JButton btnTesxt = new JButton("test");
            btnTesxt.setBounds(104, 221, 89, 23);
            add(btnTesxt);
    }
}

Vielen dank für alle die helfen im voraus

Liebe Grüße
Vivyel
 
Zuletzt bearbeitet von einem Moderator:

Vivyel

Mitglied
ok sry ich weis jetzt worin mein fehler lag.Beim hinzufügen neuer JPanels zur Navigation in der testumgebung.
Ich hab aber immer noch das Problem, dass es in der eigentlichen Anwendung nicht einwandfrei funktioniert. das mit dem minimieren hilft nichts. Er navigiert gar nicht mehr und button bleibt gedrückt.

meine größte sorgen ist allerdings, dass die navigation mit container nicht mit meinen handgeschriebenen buttons funktioniert. (siehe oben)
liegt wahrscheinlich darin, dass sie private methoden sind?


Lösung hinzufügen von neuen JPanels
Java:
public class matheRekorde extends JPanel {
    /**
     * Create the panel.
     */
    public matheRekorde(Container c) {
         c.removeAll();  //--------------------------------------------C!!!!!!!!!
          c.setLayout(null);
            setLayout(null);
            setBounds(0, 0, 800, 600);
            setSize(800,600);
       
            JButton btnTesxt = new JButton("test");
            btnTesxt.setBounds(104, 221, 89, 23);
            add(btnTesxt);
       
            c.add(this);
            c.revalidate();
            c.repaint();
    }
}
ein schöner anständiger code ist mir wichtig.
kannst du mir vielleicht sagen, wie der container mit meinen private JButton getbutton() schreibweise funktioniert?
ich bekomms nicht hin :(
 
Zuletzt bearbeitet von einem Moderator:

Hellosager

Aktives Mitglied
Übergib deiner getbtnmatheRekorde() einen Parameter Container c und ruf sie mit c auf.
Java:
 private JButton getbtnmatheRekorde(Container c) {

}
Java:
public matheMenue(Container c) {
add(getbtnmatheRekorde(c);
}


Benutzt du eine IDE?
Die würde glaube ich für viele dieser Probleme Lösungvorschläge anbieten.
 
Zuletzt bearbeitet:

Vivyel

Mitglied
vielen vielen vielen lieben Dank jetzt funktioniert es so wie ich es mir vorgestellt hatte. die lösungsvorschläge die ich von eclipse bekomme sind meistens eher nicht zu gebrauchen. beim add hatte es mir vorgeschlagen container c rein zu schreiben und dann eine child/prarent beziehung draus zu machen.

des weiteren hab ich festgestellt wenn ich den container neu importiere, dass es dann auf einmal funktioniert, wenn es das trotz richtiger schreibweise nicht getan hat. warum das so ist weiß ich allerdings nicht. hauptsache es funktioniert:)

neues Problem:
wenn ich die Buttons und co aus der GUI anders anordnen möchte, sind sie im Windowbuilder nicht mehr zu sehen. das liegt vermutlich daran, dass sie im Container sind.

dann muss ich wohl doch die andre schreibweise nehmen anstatt meine private button getbutton()? :(
 
Zuletzt bearbeitet:

Hellosager

Aktives Mitglied
WindowBuilder kenne ich mich leider nicht aus.
Es empfiehlt sich aber allgemein ohnehin, kein Null-Layout zu nehmen.
Damit hat man meist nur Probleme.
 

Vivyel

Mitglied
ich nutze den builder nur für die optik. durch ziehen und schieben kann man alle elemente im Fenster dort positionieren, wo man möchte. Ich kann mir das layout nämlich nicht anhand des codes vorstellen, da hilft mir der builder gut aus :)
mein letztes problem ist auch nicht so schlimm ich komm damit klar, hab einen guten kompromiss gefunden.

nochmals vielen dank für deine Hilfe. die navigation funktioniert jetzt sehr gut.

// bisschen offtopic
im moment beschäftigt mich etwas anderes, eigentlich sehr simples.
ich hab eine static variable die ich von klasse1 an klasse2 weitergebe. je nachdem welcher button in klasse 1 gedrückt wird, wird eine zahl an klasse2 weiter gegeben und dort etwas in ein leeres label geschrieben.
von der 2. klasen kann ich wieder zurück in die 1. klasse navigieren. wenn ich dort jedoch wieder auf einen der Buttons klicke verändert sich die static variable nicht mehr. es steht immer das vom ersten gedrückten button im label.

selbst wenn ich dem zurückbutton zb. die 0 zuweise und dann in den buttons von klasse 1 eine ifclause mit if(variable==0){variable=1;} mache ändert sich nichts, wenn ich zurück navigieren und einen anderen button wähle.
 
Zuletzt bearbeitet:

Vivyel

Mitglied
ja wenn ich beim ersten mal einen button in klasse 1 drücke wird der text in klasse 2 in das label geschrieben(die variable wird richtig übergeben). sobald ich mit dem button zurück zur klasse 1 gehe und auf einen anderen drücke, wird die variable nicht mehr "zurückgesetzt"/überschrieben, damit das richtige wort erscheint. wenn das erste wort zb. addieren war bleibt es stehen egal wie oft ich auf einen anderen button klicke und zwischen den klassen switche.

ich habe die buttons addieren und subtrahieren mit der variablen bestückt. beim ersten mal rein navigieren klappt alles wie geplant.
->zurück zum hauptmenü
->anderer button drücken
->text im label unverändert, bleibt beim ersten stehn.

hier mal die beiden testklassen:
Java:
public class matheMenue extends JPanel {
    private JButton btnAddieren;
    private JButton btnSubtrahieren;
 
    static int m;
    
    /**
     * Create the panel.
     */
    public matheMenue(Container c) { //<----- container
         c.removeAll();  //--------------------------------------------C!!!!!!!!!
          c.setLayout(null);
            setLayout(null);
            setBounds(0, 0, 800, 600);
            setSize(800,600);

            c.add(this);
            c.revalidate();
            c.repaint();
         
             add(getbtnAddieren(c));
             add(getbtnSubtrahieren(c));
        JButton btnNewButton = new JButton("bbbbbbbb");
        btnNewButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
             
                ///----------------------------------------------im button einstellungen
            //    new matheEinstellungen(c);
                new matheEinstellungen(c);
                //-----------------------
            }
        });
        btnNewButton.setBounds(39, 25, 227, 71);
        add(btnNewButton);

        JButton btnhauptmenue = new JButton("hauptmen\u00FC");
        btnhauptmenue.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
             
                //-------------------------                         im button hauptmenü
          // new StartBildschirm(c);
                new StartBildschirm(c);
             //----------------------------
            }
        });
        btnhauptmenue.setBounds(39, 376, 204, 85);
        add(btnhauptmenue);
     
        JButton btnNewButton_1 = new JButton("New button");
        btnNewButton_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                new matheRekorde(c);
            }
        });
        btnNewButton_1.setBounds(58, 130, 89, 23);
        add(btnNewButton_1);
    }
    private JButton getbtnAddieren(Container c) {
         if (btnAddieren == null) {
             btnAddieren = new JButton("Addieren");
             btnAddieren.setBackground(new Color(0, 153, 0));
             btnAddieren.setForeground(new Color(255, 255, 255));
             btnAddieren.setFont(new Font("Tahoma", Font.BOLD, 14));
             btnAddieren.setBounds(311, 118, 165, 51);
             btnAddieren.addActionListener(new ActionListener() {
                 public void actionPerformed(ActionEvent e) {
                     m=1;
                     new matheRekorde (c);
              
                 /*    if(m==0)
                     {
                         m=1;
                     }
                 new matheRekorde (c);
                 */ 
                 }
             });
         }
         return btnAddieren;
}
  
  
     //----------------------------------------------------------------------------------------- Button SUBTRAHIEREN
     private JButton getbtnSubtrahieren(Container c) {
         if (btnSubtrahieren == null) {
             btnSubtrahieren = new JButton("Subtrahieren");
             btnSubtrahieren.setBackground(Color.RED);
             btnSubtrahieren.setForeground(new Color(255, 255, 255));
             btnSubtrahieren.setFont(new Font("Tahoma", Font.BOLD, 14));
             btnSubtrahieren.setBounds(311, 180, 165, 51);
             btnSubtrahieren.addActionListener(new ActionListener() {
                 public void actionPerformed(ActionEvent e) {
                     m=2;
                     new matheRekorde(c);
                 }
             });
         }
         return btnSubtrahieren;
     }}



Java:
public class matheRekorde extends JPanel {
    static int m=matheMenue.m;
    /**
     * Create the panel.
     */
    public matheRekorde(Container c) {
         c.removeAll();  //--------------------------------------------C!!!!!!!!!
          c.setLayout(null);
            setLayout(null);
            setBounds(0, 0, 800, 600);
            setSize(800,600);
         
            JButton btnTesxt = new JButton("MatheMen\u00FC");
            btnTesxt.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    new matheMenue(c);
                }
            });
            btnTesxt.setBounds(40, 50, 191, 85);
            add(btnTesxt);
         
            c.add(this);
         
            JLabel lbltest = new JLabel("");
            lbltest.setFont(new Font("Tahoma", Font.BOLD, 28));
            lbltest.setBounds(225, 258, 230, 85);
            add(lbltest);
            c.revalidate();
            c.repaint();
         
            if(m==1){
                 lbltest.setText("Addieren");
             }

         if(m==2){
                 lbltest.setText("Subtrahieren");
             }
        
      
    }
}
 
Zuletzt bearbeitet:

Hellosager

Aktives Mitglied
Du änderst einfach

Java:
public class matheRekorde extends JPanel {
    static int m=matheMenue.m;

    public matheRekorde(Container c) {

}

in folgendes ab:

Java:
public class matheRekorde extends JPanel {
    static int m;

    public matheRekorde(Container c) {
        m = matheMenue.m;
// ....
}
 

Vivyel

Mitglied
Jetzt funktioniert es einwandfei, danke für deine Hilfe. Ich dachte der Fehler würde woanders liegen, darauf wär ich so schnell nicht gekommen.

//bisschen anderes offtopic (ich sollte mal einen anderen thread aufmachen)
Ich bastel auch schon am nächsten Teil für mein Programm.

Um langen code zu vermeiden versuche ich gerade ein paar methoden zu schreiben, die möglichst kurz meine gewünschte funktion erfüllen.(eine funktionierende sehr lange code version im dirty write stil habe ich bereits) bisher bin ich weniger erfolgreich darin den code effektiv zu kürzen. Vielleicht hast du ein paar tipps für mich.

ich möchte eine methode schreiben die mehrere buttons gleich einfärbt und allen die gleichen mauseffekte (pressed, released, entered und exited) gibt. habs heute mit e.getSource probiert aber das funktioniert i-wie nicht.(funktioniert teilweise, ist noch in bearbeitung)

außerdem hab ich noch eine methode, die erkennt welche taste gedrückt wird (auf tastatur) und schreibt diese in ein label. ich glaub aber dass ich die nicht mehr kürzen kann.(funktioniert)

hier mal meine testklasse mit 2 buttons und einem eingabelabel
Java:
public class testTest extends JFrame {

    private JPanel contentPane;
     private JLabel lbleingabe;
      private JButton btn1;
      private JButton btn2;
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    testTest frame = new testTest();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public testTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 800, 600);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        setSize(800,600);
          add(getlbleingabe()); 
          add(getbtn1());
          add(getbtn2());
         
         
         gettasteneingabe(); //tastur
         buttoncolor();      //button + mauseenterd + co
   
   
                    }
       
       
    private JLabel getlbleingabe() {
        if (lbleingabe == null) {
            lbleingabe = new JLabel("");
            lbleingabe.setBounds(354, 164, 101, 32);
            lbleingabe.setFont(new Font("Tahoma", Font.BOLD, 14));
        }
        return lbleingabe;
    }
    //----------------------------------------------------------------------
   
   
    //----------------------------------------------------------------------------------------- Button 1
            private JButton getbtn1() {
                if (btn1 == null) {
                    btn1 = new JButton("1");
                    //btn1.setForeground(Color.WHITE);
                    //btn1.setBackground(new Color(102, 51, 153));
                    btn1.setFont(new Font("Tahoma", Font.BOLD, 14));
                    btn1.setBounds(311, 367, 50, 51);
                    btn1.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            lbleingabe.setText(lbleingabe.getText() +"1");
                            //buttoncolor();
                            //gettasteneingabe();
                        }
                    });
                   
                }
                return btn1;
               
        }
           
    //--------------------------------------------------------------------------------------------button 2
   
   
   
            private JButton getbtn2() {
                if (btn2 == null) {
                    btn2 = new JButton("2");
                   
                //    buttoncolor();
                   
                    //btn2.setForeground(Color.WHITE);
                    //btn2.setBackground(new Color(102, 51, 153));
                    btn2.setFont(new Font("Tahoma", Font.BOLD, 14));
                    btn2.setBounds(380, 367, 50, 51);
                   
                     btn2.getInputMap( JComponent.WHEN_IN_FOCUSED_WINDOW ).put( KeyStroke.getKeyStroke( '2' ), "Aktion für 2" );
                     btn2.getActionMap().put( "Aktion für 2", new AbstractAction() {

                       /**
                         *
                         */
                        private static final long serialVersionUID = 1L;

                    @Override
                       public void actionPerformed( ActionEvent e ) {
                
                         lbleingabe.setText( lbleingabe.getText() + "2");
                       }
                     } );
               
                    btn2.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                           
                           
                        }
                    });
                }
                return btn2;
        }
           
        //    private void  buttonclick()
            //{
                //hier kommt die methode rein, die automatisch erkennt welcher button gedrückt wird und zb. 1 für button 1 schreibt
                //und 2 für button 2
               
    /*            if(e.getSource()==btn1){  // e.getSource geht nicht
                lbleingabe.setText( lbleingabe.getText() + "1");
                }
                   
                    if(e.getSource()==btn2){
                        lbleingabe.setText( lbleingabe.getText() + "1");
                       
                    }
                */
               
               
                /*
                 Methode aus c#, um den texfeld/label den text des buttons zu übermitteln der gerade gedrückt wird
                 versuche das morgen mal i-wie anzupassen auf java.
                       Button temp = (Button)sender; // standard klick event für die buttons 0-9
                        eingabe.Text += temp.Content.ToString();
                       eingabe.Text += eingabe.Text;
                    */

            //}
           
            private void buttoncolor()  // ich versuche hier spaghetticode zu vermeiden, bisher eher erfolglos.
            {
                btn1.setBackground(Color.BLACK);
                btn1.setForeground(Color.WHITE);
                btn2.setBackground(Color.BLACK);
                btn2.setForeground(Color.WHITE);
                //setForeground(Color.BLACK);
               
                addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseEntered(MouseEvent e)
                    {
                        if(e.getSource()==btn1) // funktioniert nicht mit get source
                        {
                           
                            btn1.setBackground(Color.green);
                        }
                       
                        if(e.getSource()==btn2){
                        btn2.setBackground(Color.green);
                        }
                    }
                   
                   
                    @Override
                    public void mouseExited(MouseEvent e) {
                       
                        if(e.getSource()==btn1)
                        {
                        btn1.setBackground(Color.black); }
                       
                        if(e.getSource()==btn2)
                        {
                       
                        btn2.setBackground(Color.black);}
                    }
                   
                   
                    @Override
                    public void mousePressed(MouseEvent e) {
                        //lbleingabe.setText( lbleingabe.getText() + "7"); // mouse pressed
                       
                   
                        if(e.getSource()==btn1){
                        btn1.setBackground(Color.red);
                        btn1.setForeground(Color.blue);
                        }
                       
               
                        if(e.getSource()==btn2){
                        btn2.setBackground(Color.white);
                        btn2.setForeground(Color.black);
                        lbleingabe.setText(lbleingabe.getText() + "7");
                        }
                    }
                   
                   
                    @Override
                    public void mouseReleased(MouseEvent e) {
                        if(e.getSource()==btn1)
                        {
                        btn1.setBackground(Color.green);
                        btn1.setForeground(Color.white);
                        }
                        if(e.getSource()==btn2)
                        {
                        btn2.setBackground(Color.green);
                        btn2.setForeground(Color.white);}
                    }
                   
                   
                });}
       
            private void gettasteneingabe() { //kann ich das noch kürzer schreiben? e.getsource funktionier bei i-wie nicht.
               
                  btn2.getInputMap( JComponent.WHEN_IN_FOCUSED_WINDOW ).put( KeyStroke.getKeyStroke( '2' ), "Aktion für 2" );
                     btn2.getActionMap().put( "Aktion für 2", new AbstractAction() {

                    @Override
                       public void actionPerformed( ActionEvent e ) {
                
                         lbleingabe.setText( lbleingabe.getText() + "2");
                       }
                     } );
                    
                    
                    
                     btn1.getInputMap( JComponent.WHEN_IN_FOCUSED_WINDOW ).put( KeyStroke.getKeyStroke( '1' ), "Aktion für 2" );
                     btn1.getActionMap().put( "Aktion für 2", new AbstractAction() {

                    @Override
                       public void actionPerformed( ActionEvent e ) {
                
                         lbleingabe.setText( lbleingabe.getText() + "1");
                       }
                     } );
               
            }}

Liebe Grüße
Vivyel
 

Hellosager

Aktives Mitglied
Ich verstehe nicht ganz wieso du die ContentPane mit einem JPanel ersetzt hast.

setSize könntest du dir sparen, weil du mit setBounds diese schon festgelegt hast.
Allerdings empfinde ich es als schlauer, setSize(800, 600) und danach setLocationRelativeTo(null) aufzurufen. Das sorgt für eine zentrierte Darstellung.

Ansich sollte sich die Ereignisbehandlung mit Listener abarbeiten lassen.
Allerdings ist es extrem unübersichtlich diese in anonymen Klassen zu realisieren.
Würdest du diese auslagern und die Listener als eigene Klassen definieren, dann würde ich mir noch mal die Mühe machen und drüber schauen. Aber da fällt das durchblicken wirklich nicht leicht.

Außerdem hast du scheinbar ein falsches Verständnis von get-Methoden.
Diese benutzt man meistens nur, wenn man eine explizite Variable geliefert haben will und besteht meist nicht aus mehr als einer Zeile. Es wäre von Vorteil, wenn du deine Methodennamen etwas umändern würdest.
Beispielsweise wäre createButton sehr viel besser als getButton.
 

Neue Themen


Oben