Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Trascinamento di una JLabel in uno ScrollPane con autoscroll

    Ho creato un'interfaccia che permette l'inserimento di una JLabel all'interno di uno scrollPane, sono riuscito a fare il trascinamento della JLabel, ma non sono riuscito ad attivare l'auto scroll nel momento in cui con il mouse sono fuori dal panel, consigli su come fare??? Grazie in anticipo a chi mi aiuterà

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Inizia con il mostrarci il relativo codice.

  3. #3
    Questa è la classe dove disegno le mie JLabel

    codice:
    public class MiddlePanel extends JPanel implements MouseListener,MouseMotionListener{
        
        int x0,y0,startx0,starty0,
                preferedWidth = getWidth(),
                preferedHeight = getHeight();
        boolean out,     //Indica se il cursore è fuori dalla finestra
                drag,    //Indica se il cursore è trascinato
                butgateact; //Indica se è stato attivato un pulsante porta della toolbar 
        Image imgtmp;
        ImageIcon imgicontmp;
        private Point corner1 = new Point(0,0);
        private Point corner2 = new Point(0,0);
        
        ArrayList<JGateLabel> gate = new ArrayList(); 
        
        public MiddlePanel(){
            LayoutManager overlay = new OverlayLayout(this) { 
                @Override
                public void layoutContainer(Container target) {  
                    int nChildren = target.getComponentCount();
                    
                    for (int i = 0; i < nChildren; i++){  
                        Component c = target.getComponent(i);  
                        c.setBounds(c.getLocation().x, c.getLocation().y,   
                                c.getPreferredSize().width, c.getPreferredSize().height);  
                    }  
                }
            };
            
            setMaximumSize(new Dimension(800,600));
            setLayout(overlay);
            addMouseListener(this);
            addMouseMotionListener(this);
            setBackground(Color.white);
       } 
       
       //Un metodo che restituisce se non c'è il rischio di sovrappore i componenti figlio
       @Override
       public boolean isOptimizedDrawingEnabled() {
            return false;
       }
            
       @Override
       public void paintComponent(Graphics g){
           super.paintComponent(g);
           g.setColor(Color.LIGHT_GRAY);
           paintGateTmp(g);
           paintGrid(g);
           paintSelection(g);
       }
       
       //Serve per creare un rettangolo per selezionare i componenti
       public void paintSelection(Graphics g){
           int x = Math.min(corner1.x,corner2.x);
           int y = Math.min(corner1.y,corner2.y);
           int width  = Math.abs(corner1.x - corner2.x);
           int height = Math.abs(corner1.y - corner2.y);
           
           g.setColor(Color.CYAN);
           g.drawRect(x, y, width, height);
           g.setColor(Color.BLUE);
           g.fillRect(x+1, y+1, width-1, height-1);
       }
       
       //Disegna la porta
       public void paintGateTmp(Graphics g){
           if(butgateact){
               g.drawImage(imgtmp,x0-24,y0-24,this);
               g.setColor(Color.DARK_GRAY);  //Cambia il colore della griglia momentaneamente
           }
       }
       
       //Disegna la griglia
       public void paintGrid(Graphics g){
           for(int i=0; i<getWidth() || i<getHeight(); i+=20) {
              g.drawLine(i,0,i,getHeight());
              g.drawLine(0,i,getWidth(),i);
           }
       }
       
       //Crea una porta passando l'immagine temporanea utilizzata, la posizione del mouse, è una costante passata dal core (Da sistemare)
       public JGateLabel createGate(MouseEvent e){
           JGateLabel Jglbl = new JGateLabel(imgicontmp,e,0);
           refresh(Jglbl,e);
           add(Jglbl);
           return Jglbl;
       }
       
       //Refrescia quando l'oggetto è una JGateLabel (o un JLineLabel)
       public void refresh(JGateLabel j,MouseEvent e){
           refreshGrid(j);
           moveScroolBar(e.getPoint(),j);
           revalidate();
           repaint();
       }
       
       //Muove la scroll bar solo se il cursore è fuori dal Frame
       public void moveScroolBar(Point p,JGateLabel c){
           if(!LCE01.Grafica.Split.onScreen(c) && LCE01.Grafica.Split.MP.out){
               LCE01.Grafica.Split.mySetJViewport(this,MouseInfo.getPointerInfo().getLocation(),c);
           }
       }
       
       //Aggiorna la griglia, estendola (farla ridurre se necessario da sistemare) 
       public void refreshGrid(JLabel j){
            if((j.getX()+j.getIcon().getIconWidth())>preferedWidth) preferedWidth = j.getX()+j.getIcon().getIconWidth();
            if((j.getY()+j.getIcon().getIconHeight()>preferedHeight)) preferedHeight = j.getY()+j.getIcon().getIconHeight();
            setPreferredSize(new Dimension(preferedWidth,preferedHeight));
       }
       
       //Si potrebbe creare una lista di coordianate x e y di ogni label in ordine decrescente così da evitare di fare una ricerca su tutti i componenti
       public Dimension searchSizeGrid(){
           int x = getWidth();
           int y = getHeight();
           for(int i=0;i<gate.size();i++){
               if(x<gate.get(i).getX())
                   x = gate.get(i).getX();
               if(y<gate.get(i).getY())
                   y = gate.get(i).getY();
           }
           
           return new Dimension(x,y);
       }
       
       @Override
       public void mouseClicked(MouseEvent e) {
           if(butgateact)
                gate.add(createGate(e));    
           drag = false;
           startx0 = 0;
           starty0 = 0;
           butgateact = false;
           imgtmp = null;
           imgicontmp = null;
           setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
           repaint();
       }
    
       @Override
       public void mousePressed(MouseEvent e) {
           corner1 = e.getPoint();
           corner2 = corner1;
           repaint();
       }
    
       @Override
       public void mouseReleased(MouseEvent e) {
           corner1 = e.getPoint();
           corner2 = corner1;
           repaint();
       }
       
       @Override
       public void mouseEntered(MouseEvent e) {       
           out = false;
           repaint();
       }
       
       @Override
       public void mouseExited(MouseEvent e) {
           out = true;
           repaint();
       }
    
       @Override
       public void mouseDragged(MouseEvent e) {
           corner2 = e.getPoint();
           drag = true;
           repaint();
       }
       
       @Override
       public void mouseMoved(MouseEvent e) {
           x0 = e.getX();
           y0 = e.getY();
           drag = false;
           repaint();
       }
       
       public void setImageTmp(Image i){
           setCursor(new Cursor(Cursor.MOVE_CURSOR));
           imgtmp = i;
           imgicontmp = new ImageIcon(i);
           butgateact = true;
       } 
    }
    E questa è la classe dove estendo la JLabel, che poi sono quelle che disegno nel panel...

    codice:
    import java.awt.Component;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.border.BevelBorder;
    
    public class JGateLabel extends JLabel{
    
        public boolean out;
        private int id;
                
        public JGateLabel(ImageIcon i,MouseEvent e,int _id){
            id = _id;
            setIcon(i); 
            setBounds(e.getX()-24,e.getY()-24,getWidth(),getHeight());  
            setBorder(new BevelBorder(BevelBorder.LOWERED));
            setLayout(null);
            addMouseMotionListener(new MouseMotionAdapter() {
           
           //Serve per trascinare la JLabel dove vuoi
           @Override
           public void mouseDragged(MouseEvent e) {
                Component c = e.getComponent();
                c.setLocation(c.getX()+e.getX(), c.getY()+e.getY());
                LCE01.Grafica.Split.MP.refresh((JGateLabel)e.getSource(), e);
            }
           });
            addMouseListener(new MouseAdapter() {
            
            @Override
            public void mouseEntered(MouseEvent e){
                out = false;
            }
            
            @Override
            public void mouseExited(MouseEvent e){
                out = true;
            }
            });
        }   
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Modifica il post, rimuovi tutto e reincolla...chiudendo il tag nel modo corretto. lol

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.