Effetto slide su componenti grafiche

Stato
Discussione chiusa ad ulteriori risposte.

R4z0r_Cr4sH

Utente Electrum
10 Giugno 2007
501
11
6
148
Ho realizzato (un po' per noia,un po' per necessità) del codice che ci permette di dare a dei componenti (io ho utilizzato una JTextArea ma al suo posto possiamo usare JPanel e quant'altro) un effetto slide,posto due immagini che rendono l'idea meglio delle parole:

72912744.jpg
71275310.jpg


il codice per realizzare ciò è molto semplice:
Codice:
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;


public class SlideComponent extends JFrame implements ActionListener{

    JPanel p=new JPanel();
    JToggleButton but=new JToggleButton("Apri");
    JTextArea a=new JTextArea();
    
    public SlideComponent(){
        add(p);
        p.setLayout(null);
        p.add(a).setBounds(2,0,200,2);
        p.add(but).setBounds(2,2,200,14);
        
        a.setEditable(false);
        
        but.addActionListener(this);
        
        setLocation(396,277);
        setSize(214,257);
        setVisible(true);
        show();
    }
    
    public void actionPerformed(ActionEvent e){
        if(but.getText().equals("Apri")){
                a.setSize(200,200);
                a.setLocation(2,0);
                but.setLocation(2,200);
                but.setText("Chiudi");
        }else{
                a.setSize(200,2);
                a.setLocation(2,0);
                but.setLocation(2,2);
                but.setText("Apri");
        } 
        repaint();
    }
}
 
ho modificato il codice utilizzando i Thread cosichè lo scorrimento non influisca sul processo centrale del programma in cui l'effetto verrebbe utilizzato infatti ora lo scorrimento dei componenti è ben visibile e piuttosto fluido.
Codice:
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;


public class SlideComponent extends JFrame implements ActionListener{

    JPanel p=new JPanel();
    JToggleButton button=new JToggleButton("Apri");
    JTextArea area=new JTextArea();
    Runnable up=new MThread(this,0,2);
    Runnable down=new MThread(this,1,2);
    
    public SlideComponent(){
        add(p);
        p.setLayout(null);
        p.add(area).setBounds(2,0,200,2);
        p.add(button).setBounds(2,2,200,14);
        
        area.setEditable(false);
        
        button.addActionListener(this);
        
        setLocation(396,277);
        setSize(214,257);
        setVisible(true);
        show();
    }
    public void actionPerformed(ActionEvent e){
        if(button.getText().equals("Apri")){
            new Thread(up).start();
            button.setText("Chiudi");
        }else{
            new Thread(down).start();
            button.setText("Apri");
        }
    }
}

class MThread implements Runnable{
    SlideComponent sc;
    int action,speed=0;
    public MThread(SlideComponent slidecomponent,int int_action,int speed){
        sc=slidecomponent;
        action=int_action;
    }
    public void run(){
        try{
            Thread.sleep(60);
            if(action==0){
                for(int i=0;i<=200;i++){
                    sc.area.setSize(200,i);
                    sc.area.setLocation(2,0);
                    sc.button.setLocation(2,i);
                    Thread.sleep(speed);
                }
            }else if(action==1){
                for(int i=200;i>=0;i--){
                    sc.area.setSize(200,i+2);
                    sc.area.setLocation(2,0);
                    sc.button.setLocation(2,i+2);
                    sc.repaint();
                    Thread.sleep(speed);
                }
           }
        }catch(InterruptedException ex){
            System.out.println(ex.getMessage());
        }
    }
}
 
non ho avuto il tempo di provarlo.. cmq il metodo show() e' un metodo deprecated e viene sostituito appunto da setVisible(true)... quindi che ci sta a fare? vabbe'... cmq carina come idea...
 
vheon ha detto:
non ho avuto il tempo di provarlo.. cmq il metodo show() e' un metodo deprecated e viene sostituito appunto da setVisible(true)... quindi che ci sta a fare? vabbe'... cmq carina come idea...
Hai ragione, però delle volte anche a me ha dato problemi setVisible(true), perchè delle volte non visualizzava nulla!!:-/
 
Comunque appena ti trovo su msn ti chiederò in che modo hai sviluppato questo sistema perchè era esattamente ciò che intendevo sviluppare per migliorare il mio ImageLoader!! :)
Comunque grifis78, penso che questa modalità di visualizzazione potrebbe essere molto utilizzata nelle applicazioni che mostrano immagini o qualsiasi altra cosa che abbia l'intenzione di mostrare qualcosa all'utente in modo dinamico e sopratutto carino!! ;)
 
@vheon:setVisible() rende il frame visibile,mentre il metodo show() porta all'attenzione il programma facendo lampeggiare l'icona del programma nella barra programmi.
@grifis78:bhe può essere applicato su ogni tipo di programma,io l'ho sviluppato per un programma da portare a scuola
@AlexZ:in che senso in che modo l'hai sviluppato?...cmq ok,sai quando trovarmi su msn...
 
@vheon precisamente...
setVisible():
Shows or hides this Window depending on the value of parameter b.
show():
Makes the Window visible. If the Window and/or its owner are not yet displayable, both are made displayable. The Window will be validated prior to being made visible. If the Window is already visible, this will bring the Window to the front.

@AlexZ:non ho seguito nessuna guida,ho semplicemente preso l'idea e realizzata in base alle mie conoscenze.Per scrivere un buon codice,bhe serve esperienza ed elasticità mentale (secondo me).
 
Stato
Discussione chiusa ad ulteriori risposte.