2014-05-21 4 views
6

Ich habe ein Menü, das eine Vielzahl von Tasten auf dem Display hat, ich bin in der Lage zu machen, dass die Knöpfe ihre jeweiligen JPanels aufrufen, wenn sie geklickt werden. Die Sache ist, ich würde gerne das Jpanel schieben, wenn es aufgerufen wird, anstatt sofort zu poppen. Ich habe versucht, mit Tween-Engine und als Java-Anfänger, finde ich es wirklich überwältigend, so entschied ich mich für zeitgesteuerte Animation. Ich konnte das Jpanel oben auf eine Seite schieben, aber aus irgendeinem Grund will das nächste Panel nicht angezeigt werden, ich bin wirklich müde, kann jemand bitte helfen! Dort ist Code unten:Java gleitende JPanels

public class Listener implements ActionListener { 
    @Override 
    public void actionPerformed(ActionEvent e) { 

     new Timer(0, new ActionListener() { 
      public void actionPerformed(ActionEvent e) {     

       mainpane.setLocation(mainpane.getX() - 10, 0); 
       if (mainpane.getX() + mainpane.getWidth() == 0) 
       { 
       ((Timer) e.getSource()).stop(); 
        System.out.println("Timer stopped"); 
       } 
      } 
     }).start(); 
    } 
} 

Antwort

13

Schiebepaneele können schwierig sein. Hier ist ein Startcode. Ändern Sie, um Ihre Bedürfnisse anzupassen. Fügen Sie nach Bedarf Fehlerprüfung und Ausnahmebehandlung hinzu.

In diesem Beispiel werden JButtons und ein JTree als Inhalt verwendet, aber Sie können fast jede Art von Inhalt verwenden.

Example Slider

Verbrauch:

static public void main(final String[] args) throws Exception { 
    SwingUtilities.invokeAndWait(new Runnable() { 
     @Override 
     public void run() { 
      final JFrame jFrame = new JFrame() { 
       { 
        final PanelSlider42<JFrame> slider = new PanelSlider42<JFrame>(this); 
        final JPanel jPanel = slider.getBasePanel(); 

        slider.addComponent(new JButton("1")); 
        slider.addComponent(new JButton("22")); 
        slider.addComponent(new JButton("333")); 
        slider.addComponent(new JButton("4444")); 

        getContentPane().add(jPanel); 
        setSize(300, 300); 
        setLocationRelativeTo(null); 
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
        setVisible(true); 
       } 
      }; 
     } 
    }); 
} 

Die impl lang ist ...

package com.java42.example.code; 

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Container; 
import java.awt.Cursor; 
import java.awt.Insets; 
import java.awt.Point; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyAdapter; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseMotionAdapter; 
import java.util.ArrayList; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JWindow; 
import javax.swing.SwingUtilities; 

public class PanelSlider42<ParentType extends Container> { 

private static final int   RIGHT    = 0x01; 
private static final int   LEFT    = 0x02; 
private static final int   TOP    = 0x03; 
private static final int   BOTTOM   = 0x04; 
private final JPanel    basePanel   = new JPanel(); 
private final ParentType   parent; 
private final Object    lock    = new Object(); 
private final ArrayList<Component> jPanels   = new ArrayList<Component>(); 
private final boolean    useSlideButton = true; 
private boolean     isSlideInProgress = false; 

private final JPanel    glassPane; 
{ 
    glassPane = new JPanel(); 
    glassPane.setOpaque(false); 
    glassPane.addMouseListener(new MouseAdapter() { 
    }); 
    glassPane.addMouseMotionListener(new MouseMotionAdapter() { 
    }); 
    glassPane.addKeyListener(new KeyAdapter() { 
    }); 
} 

public PanelSlider42(final ParentType parent) { 
    if (parent == null) { 
     throw new RuntimeException("ProgramCheck: Parent can not be null."); 
    } 
    if ((parent instanceof JFrame) || (parent instanceof JDialog) || (parent instanceof JWindow) || (parent instanceof JPanel)) { 
    } 
    else { 
     throw new RuntimeException("ProgramCheck: Parent type not supported. " + parent.getClass().getSimpleName()); 
    } 
    this.parent = parent; 
    attach(); 
    basePanel.setSize(parent.getSize()); 
    basePanel.setLayout(new BorderLayout()); 
    if (useSlideButton) { 
     final JPanel statusPanel = new JPanel(); 
     basePanel.add(statusPanel, BorderLayout.SOUTH); 
     statusPanel.add(new JButton("Slide Left") { 
      private static final long serialVersionUID = 9204819004142223529L; 
      { 
       setMargin(new Insets(0, 0, 0, 0)); 
      } 
      { 
       addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(final ActionEvent e) { 
         slideLeft(); 
        } 
       }); 
      } 
     }); 
     statusPanel.add(new JButton("Slide Right") { 
      { 
       setMargin(new Insets(0, 0, 0, 0)); 
      } 
      private static final long serialVersionUID = 9204819004142223529L; 
      { 
       addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(final ActionEvent e) { 
         slideRight(); 
        } 
       }); 
      } 
     }); 
     statusPanel.add(new JButton("Slide Up") { 
      { 
       setMargin(new Insets(0, 0, 0, 0)); 
      } 
      private static final long serialVersionUID = 9204819004142223529L; 
      { 
       addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(final ActionEvent e) { 
         slideTop(); 
        } 
       }); 
      } 
     }); 
     statusPanel.add(new JButton("Slide Down") { 
      { 
       setMargin(new Insets(0, 0, 0, 0)); 
      } 
      private static final long serialVersionUID = 9204819004142223529L; 
      { 
       addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(final ActionEvent e) { 
         slideBottom(); 
        } 
       }); 
      } 
     }); 
    } 
} 

public JPanel getBasePanel() { 
    return basePanel; 
} 

private void attach() { 
    final ParentType w = this.parent; 
    if (w instanceof JFrame) { 
     final JFrame j = (JFrame) w; 
     if (j.getContentPane().getComponents().length > 0) { 
      throw new RuntimeException("ProgramCheck: Parent already contains content."); 
     } 
     j.getContentPane().add(basePanel); 
    } 
    if (w instanceof JDialog) { 
     final JDialog j = (JDialog) w; 
     if (j.getContentPane().getComponents().length > 0) { 
      throw new RuntimeException("ProgramCheck: Parent already contains content."); 
     } 
     j.getContentPane().add(basePanel); 
    } 
    if (w instanceof JWindow) { 
     final JWindow j = (JWindow) w; 
     if (j.getContentPane().getComponents().length > 0) { 
      throw new RuntimeException("ProgramCheck: Parent already contains content."); 
     } 
     j.getContentPane().add(basePanel); 
    } 
    if (w instanceof JPanel) { 
     final JPanel j = (JPanel) w; 
     if (j.getComponents().length > 0) { 
      throw new RuntimeException("ProgramCheck: Parent already contains content."); 
     } 
     j.add(basePanel); 
    } 
} 

public void addComponent(final Component component) { 
    if (jPanels.contains(component)) { 
    } 
    else { 
     jPanels.add(component); 
     if (jPanels.size() == 1) { 
      basePanel.add(component); 
     } 
     component.setSize(basePanel.getSize()); 
     component.setLocation(0, 0); 
    } 
} 

public void removeComponent(final Component component) { 
    if (jPanels.contains(component)) { 
     jPanels.remove(component); 
    } 
} 

public void slideLeft() { 
    slide(LEFT); 
} 

public void slideRight() { 
    slide(RIGHT); 
} 

public void slideTop() { 
    slide(TOP); 
} 

public void slideBottom() { 
    slide(BOTTOM); 
} 

private void enableUserInput(final ParentType w) { 
    if (w instanceof JFrame) { 
     ((JFrame) w).getGlassPane().setVisible(false); 
    } 
    if (w instanceof JDialog) { 
     ((JDialog) w).getGlassPane().setVisible(false); 
    } 
    if (w instanceof JWindow) { 
     ((JWindow) w).getGlassPane().setVisible(false); 
    } 
} 

private void disableUserInput(final ParentType w) { 
    if (w instanceof JFrame) { 
     ((JFrame) w).setGlassPane(glassPane); 
    } 
    if (w instanceof JDialog) { 
     ((JDialog) w).setGlassPane(glassPane); 
    } 
    if (w instanceof JWindow) { 
     ((JWindow) w).setGlassPane(glassPane); 
    } 
    glassPane.setVisible(true); 
} 

private void enableTransparentOverylay() { 
    if (parent instanceof JFrame) { 
     ((JFrame) parent).getContentPane().setBackground(jPanels.get(0).getBackground()); 
     parent.remove(basePanel); 
     parent.validate(); 
    } 
    if (parent instanceof JDialog) { 
     ((JDialog) parent).getContentPane().setBackground(jPanels.get(0).getBackground()); 
     parent.remove(basePanel); 
     parent.validate(); 
    } 
    if (parent instanceof JWindow) { 
     ((JWindow) parent).getContentPane().setBackground(jPanels.get(0).getBackground()); 
     parent.remove(basePanel); 
     parent.validate(); 
    } 
} 

private void slide(final int slideType) { 
    if (!isSlideInProgress) { 
     isSlideInProgress = true; 
     final Thread t0 = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       parent.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 
       disableUserInput(parent); 
       slide(true, slideType); 
       enableUserInput(parent); 
       parent.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
       isSlideInProgress = false; 
      } 
     }); 
     t0.setDaemon(true); 
     t0.start(); 
    } 
    else { 
     Toolkit.getDefaultToolkit().beep(); 
    } 
} 

private void slide(final boolean useLoop, final int slideType) { 
    if (jPanels.size() < 2) { 
     System.err.println("Not enough panels"); 
     return; 
    } 
    synchronized (lock) { 
     Component componentOld = null; 
     Component componentNew = null; 
     if ((slideType == LEFT) || (slideType == TOP)) { 
      componentNew = jPanels.remove(jPanels.size() - 1); 
      componentOld = jPanels.get(0); 
      jPanels.add(0, componentNew); 
     } 
     if ((slideType == RIGHT) || (slideType == BOTTOM)) { 
      componentOld = jPanels.remove(0); 
      jPanels.add(componentOld); 
      componentNew = jPanels.get(0); 
     } 
     final int w = componentOld.getWidth(); 
     final int h = componentOld.getHeight(); 
     final Point p1 = componentOld.getLocation(); 
     final Point p2 = new Point(0, 0); 
     if (slideType == LEFT) { 
      p2.x += w; 
     } 
     if (slideType == RIGHT) { 
      p2.x -= w; 
     } 
     if (slideType == TOP) { 
      p2.y += h; 
     } 
     if (slideType == BOTTOM) { 
      p2.y -= h; 
     } 
     componentNew.setLocation(p2); 
     int step = 0; 
     if ((slideType == LEFT) || (slideType == RIGHT)) { 
      step = (int) (((float) parent.getWidth()/(float) Toolkit.getDefaultToolkit().getScreenSize().width) * 40.f); 
     } 
     else { 
      step = (int) (((float) parent.getHeight()/(float) Toolkit.getDefaultToolkit().getScreenSize().height) * 20.f); 
     } 
     step = step < 5 ? 5 : step; 
     basePanel.add(componentNew); 
     basePanel.revalidate(); 
     if (useLoop) { 
      final int max = (slideType == LEFT) || (slideType == RIGHT) ? w : h; 
      final long t0 = System.currentTimeMillis(); 
      for (int i = 0; i != (max/step); i++) { 
       switch (slideType) { 
        case LEFT: { 
         p1.x -= step; 
         componentOld.setLocation(p1); 
         p2.x -= step; 
         componentNew.setLocation(p2); 
         break; 
        } 
        case RIGHT: { 
         p1.x += step; 
         componentOld.setLocation(p1); 
         p2.x += step; 
         componentNew.setLocation(p2); 
         break; 
        } 
        case TOP: { 
         p1.y -= step; 
         componentOld.setLocation(p1); 
         p2.y -= step; 
         componentNew.setLocation(p2); 
         break; 
        } 
        case BOTTOM: { 
         p1.y += step; 
         componentOld.setLocation(p1); 
         p2.y += step; 
         componentNew.setLocation(p2); 
         break; 
        } 
        default: 
         new RuntimeException("ProgramCheck").printStackTrace(); 
         break; 
       } 

       try { 
        Thread.sleep(500/(max/step)); 
       } catch (final Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      final long t1 = System.currentTimeMillis(); 
     } 
     componentOld.setLocation(-10000, -10000); 
     componentNew.setLocation(0, 0); 
    } 
} 
} 
+1

Es sieht aus wie der Code refractored könnte etwas sauberer zu sein, und die Animation ist nur ein bisschen abgehackt, aber es funktioniert, und das ist beeindruckend. Gut gemacht. – MirroredFate

+1

Sorry für die späte Antwort, war beschäftigt mit Mitte des Jahres Prüfungen! Ich möchte mich sehr für diesen Code bedanken, obwohl er sehr lang ist, aber er funktioniert super! Vielen Dank Kumpel! – spongyboss

+1

Studiere hart, hohe Noten zahlen sich langfristig aus ... – Java42

2

ich für dieses Problem ago.I einige Zeit diesen Beispielcode irgendwo gefunden gesucht - gespeichert in meinem Evernote für zukünftige Referenz. Dies ist der kürzeste Weg zu implementieren, dass, wenn ich gegoogelt, dass in der Vergangenheit

import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

public class SlidingPanel { 

    JPanel panel; 

    public void makeUI() { 
     panel = new JPanel(); 
     panel.setBackground(Color.RED); 
     panel.setBounds(0, 0, 400, 400); 

     JButton button = new JButton("Click"); 
     button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      ((JButton) e.getSource()).setEnabled(false); 
      new Timer(1, new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        panel.setLocation(panel.getX() - 1, 0); 
        if (panel.getX() + panel.getWidth() == 0) { 
        ((Timer) e.getSource()).stop(); 
       System.out.println("Timer stopped"); 
      } 
       } 
      }).start(); 
     } 
     }); 
     panel.add(button); 
     JFrame frame = new JFrame("Sliding Panel"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400, 400); 
     frame.setLocationRelativeTo(null); 
     frame.setLayout(null); 
     frame.add(panel); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new SlidingPanel().makeUI(); 
     } 
     }); 
    } 
}