Variable aus Schleife/Switch benutzen

  • Themenstarter Themenstarter Queztapotel
  • Beginndatum Beginndatum
Q

Queztapotel

Gast
Hallo zusammen

Folgendes, ich habe einen JButton welcher bei Knopfdruck ein Panel einklappt. Dies funktioniert soweit auch ganz gut. Nur will ich es auf zwei ermöglichen. Einerseits durch langsames zugleiten anderseits durch einfaches ausblenden. Nun das Problem: Ich will dass, das Panel an die gleichen Punkt zurückspringt bzw. gleitet an welchem es zuvor war. Die Panelgrösse ist variabel. Nun wird das in beiden Fällen (gleiten/springen) sowie in beide Richtungen (auf/zu) in Schleifen geregelt. Und das ist jetzt der "springende" Punkt, ich will eine Variabel beim zumachen speichern, welches sich merkt wo das Panel war und dann in der Auf-Schleife benutzt um es an die Stelle zurückzuführen. Ich hab das ganze auch mal in einen Switch gepackt in der naiven Hoffnung es dort zum laufen zu bekommen durch eventuell andere Richtlinien was Variablen angeht, aber vergeblich.
Ich hoffe ihr könnt mir helfen.

Gruss
Queztapotel
 
Du machst dir eine Variable panelLocation vom Typ Point. Dort speicherst du nach dem Drücken des Buttons die Position des Panels ein (natürlich nur wenn es gerade sichtbar ist und nach dem Drücken verschwinden soll).
Wird der Button jetzt erneut gedrückt, kannst du die Abbruchbedingung deiner Schleife doch mit Hilfe der panelLocation Variable einstellen, ... Wo liegt da das Problem ?
 
Hi,
folgendes soll keine Lösung sein, sondern eher eine Art Vorschlag, wie du die eventuell eine Menge Zeit einsparen könntest...
Ich gehe davon aus, dass du in Swing arbeitest. Dort gibt es die Möglichkeit mit SplitPanes zu arbeiten, welche meiner Meinung nach alles bereits implementieren, was du beschrieben hast.
--> How to Use Split Panes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

Edit: Ich ziele deshalb darauf hinaus, weil JSplitPane die Methoden getLastDividerLocation()/getDividerLocation() implementiert, welches auf dein Problem gut passen würde. Divider ist der Trennstrich in der Mitte.
 
Zuletzt bearbeitet:
Hi,
folgendes soll keine Lösung sein, sondern eher eine Art Vorschlag, wie du die eventuell eine Menge Zeit einsparen könntest...
Ich gehe davon aus, dass du in Swing arbeitest. Dort gibt es die Möglichkeit mit SplitPanes zu arbeiten, welche meiner Meinung nach alles bereits implementieren, was du beschrieben hast.
--> How to Use Split Panes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

Edit: Ich ziele deshalb darauf hinaus, weil JSplitPane die Methoden getLastDividerLocation()/getDividerLocation() implementiert, welches auf dein Problem gut passen würde. Divider ist der Trennstrich in der Mitte.

Mit denen arbeite ich nun auch danke für den Vorschlag! Doch nun stellt sich die Frage wie ich dafür sorge das LastDividerLocation beim erneuten drücken nicht gleich überschrieben wird? Ich glaube am besten wenn ich den Code mal poste. Und bitte keine Syntaxvorschriften oder sonstige konventionen vorleiern. :>

Java:
private void HideShowButtonMouseClicked(java.awt.event.MouseEvent evt) {                                            
        String SlideHideEffect = ApplicationProperties.instance().getProperty(
                ApplicationProperties.APPLICATION_POSTBOXFRAME_SLIDEHIFEEFFECT);
        int iSlideHideEffect = Integer.parseInt(SlideHideEffect);
        final int DivLoc = mainSplitPane.getDividerLocation();
        int click = 0;
        if (iSlideHideEffect == 1){
             if(DivLoc < 1){
                click = 2;
             }else{
                click = 1;
             }
             if (click == 1){
                        Thread t = new Thread(new Runnable()
                        {
                            public void run()
                            {//point = new java.awt.Point(mainSplitPane.getDividerLocation());


                                for (int x=0; x<DivLoc; x+=5)
                                { final int innerX = x;
                                    SwingUtilities.invokeLater(new Runnable()
                                    {
                                        public void run()
                                        {
                                            mainSplitPane.setDividerLocation(DivLoc-innerX);
                                        }
                                    });
                                    try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }
                                }
                            }
                        });
                        t.start();
                        }else if(mainSplitPane.getLastDividerLocation() == 0){//point.getX() <= 0//point.getX() <= 0
                            Thread t2 = new Thread(new Runnable()
                                {
                                    public void run()
                                    {
                                        for (int y=-1; y<point.getX(); y+=5)
                                        { final int innerY = y;
                                            SwingUtilities.invokeLater(new Runnable()
                                            {
                                                public void run()
                                                {
                                                    mainSplitPane.setDividerLocation(0+innerY);
                                                }

                                            });
                                            try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }
                                        }
                                    }
                                    });
                                    t2.start();
        }else if(leftPanel.isVisible() == true)
            leftPanel.setVisible(false);
        else
            leftPanel.setVisible(true);
        

        //leftPanel.setVisible(true);
        //mainSplitPane.setDividerLocation(180);
        }
    }

Gruss
Queztapotel
 
Sry Code war noch ein bisschen gemixt mit verschiedenen Lösungsansätzen
Hier der richtige
Java:
private void HideShowButtonMouseClicked(java.awt.event.MouseEvent evt) {                                            
        String SlideHideEffect = ApplicationProperties.instance().getProperty(
                ApplicationProperties.APPLICATION_POSTBOXFRAME_SLIDEHIFEEFFECT);
        int iSlideHideEffect = Integer.parseInt(SlideHideEffect);
        final int DivLoc = mainSplitPane.getLastDividerLocation();
        int click = 0;
        if (iSlideHideEffect == 1){
             if(DivLoc < 1){
                click = 2;
             }else{
                click = 1;
             }
             if (click == 1){
                        Thread t = new Thread(new Runnable()
                        {
                            public void run()
                            {//point = new java.awt.Point(mainSplitPane.getDividerLocation());


                                for (int x=0; x<DivLoc; x+=5)
                                { final int innerX = x;
                                    SwingUtilities.invokeLater(new Runnable()
                                    {
                                        public void run()
                                        {
                                            mainSplitPane.setDividerLocation(DivLoc-innerX);
                                        }
                                    });
                                    try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }
                                }
                            }
                        });
                        t.start();
             }else if(DivLoc == 0){//point.getX() <= 0//point.getX() <= 0
                            Thread t2 = new Thread(new Runnable()
                                {
                                    public void run()
                                    {
                                        for (int y=-1; y<DivLoc; y+=5)
                                        { final int innerY = y;
                                            SwingUtilities.invokeLater(new Runnable()
                                            {
                                                public void run()
                                                {
                                                    mainSplitPane.setDividerLocation(0+innerY);
                                                }

                                            });
                                            try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }
                                        }
                                    }
                                    });
                                    t2.start();
        }else if(leftPanel.isVisible() == true)
            leftPanel.setVisible(false);
        else
            leftPanel.setVisible(true);
        

        //leftPanel.setVisible(true);
        //mainSplitPane.setDividerLocation(180);
        }
    }
 
Ich würde mir da zwei Methoden machen - eine für das Aus- und eine für das Einblenden.

Beim Ausblenden musst du die Position des Dividers natürlich außerhalb deiner Methode abspeichern, ansonsten wird die Variable beim Verlassen der Methode ja wieder gelöscht.
Java:
int lastDivLoc;

void hideSplitPane(SplitPane sp) {
  lastDivLoc = sp.getLastDividerLocation();
  // hide sp
}

void showSplitPane(SplitPane sp) {
  // show sp
  // use lastDivLoc
}

Und bitte keine Syntaxvorschriften oder sonstige konventionen vorleiern. :>
Warum? Veträgst keine Kritik? Code-Conventionen sind nicht dazu da jemanden zu schikanieren sondern um den Code besser verstehen zu können. Damit hilfst du nicht nur dir sondern auch denjenigen die den Code später lesen müssen - also auch uns.
Außerdem kommt es oft vor, dass Anfänger Fehler machen, die den Code nicht richtig arbeiten lassen obwohl er sonst eigentlich korrekt wäre.

Deine Threads sind da ein gutes Beispiel.
Java:
for (int x = 0; x < lastDivLoc; x += 5) {
  mainSplitPane.setDividerLocation(lastDivLoc - x);
  try {
    Thread.sleep(20);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
}
Neue Threads in der Schleife zu erzeugen ist nicht nur ineffizient, es kann auch zu Fehlern führen, bei denen du dich am Schluss wundert warum der Code nicht so funktioniert wie er soll.
 
Das in zwei Methoden zu gestalten hab ich mir auch schon überlegt. Werde das mal versuchen, melde mich dann wieder. Vielen Dank für die netten Antworten, so macht das Spass hier :toll:

Ja hast ja recht, bin mir das halt von Python gewöhnt. Soll heissen wenn du da was ins Forum schreibst wirst du zuerst 10 Posts lang auf deine Syntax/Konventionsfehler hingewiesen bevor du überhaupt auch nur einen vorschlag bekommst. Aber hier ist das ja wie ich sehe netter. Danke noch wegen dem Hinweis zu den Threads.
 

Zurück
Oben