Frage

Ich versuche ein Panel mit Bildern zu erstellen, die mit der Maus verändert werden.Ich habe 10 Bilder (0.png bis 9.png).Mein Problem ist, dass ich das Bild verschieben möchte und mir gerade das zweite Bild ansehe.Ich habe das verwendet JScrollPane um zurück zum ersten Bild zu scrollen, aber nur das erste Bild wird verschoben.Wie kann ich mein Panel aktualisieren und alle Bilder verschieben können?

Das ist mein Code:

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.*;

class MapFrame extends JPanel {
    /**
     * 
     */
    private static final long serialVersionUID = (long) 1.0;
    private static Image image;
    private static JLabel label = new JLabel();
    private static int ind =0;
    private static JFrame frame;
    private static String str;
   //----------------------------------------------------------------- 
    public MapFrame(){      }

   //----------------------------------------------------------------- 

    public MapFrame(String pathe) {
        super(new BorderLayout());
          image = new ImageIcon(getClass().getResource(pathe)).getImage();
          label = new JLabel(new ImageIcon(image));  
          JScrollPane scroll = new JScrollPane(label,JScrollPane.VERTICAL_SCROLLBAR_NEVER,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
          add(scroll);

          HandLcalss hand = new HandLcalss(label);
          JViewport v = scroll.getViewport();
          v.addMouseListener(hand);
          v.addMouseMotionListener(hand);
          v.addMouseWheelListener(hand);
    }

   //----------------------------------------------------------------- 


    public static void ShowGUI(String pathe) {
        frame = new JFrame("Bladi_map");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.getContentPane().add(new MapFrame(pathe));
        frame.setSize(500,400);  
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

   //----------------------------------------------------------------- 

    public static void ChangImage(String pathe){
        frame.getContentPane().add(new MapFrame(pathe));        
        label.revalidate();
        frame.setVisible(true);     
    }

    //----------------------------------------------------------------- 
class HandLcalss implements MouseListener,MouseMotionListener,MouseWheelListener{
    private static final int DELAY = 10;
    private  Cursor hc = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
    private  Timer scroller;
    private  JComponent label;
    private  Point startPt = new Point();
    private  Point move    = new Point();
    //----------------------------------------------------------------- 
    public HandLcalss(JComponent comp) {
        this.label = comp;
        comp.getCursor();
        this.scroller = new Timer(DELAY, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {               
            }
        });
    }
    //----------------------------------------------------------------- 

    @Override public void mouseDragged(MouseEvent e) {
        JViewport vport = (JViewport)e.getSource();
        Point pt = e.getPoint();
        int dx = startPt.x - pt.x;
        int dy = startPt.y - pt.y;
        Point vp = vport.getViewPosition();
        vp.translate(dx, dy);
        label.scrollRectToVisible(new Rectangle(vp, vport.getSize()));
        startPt.setLocation(pt);
    }
    @Override
    public void mousePressed(MouseEvent e) {
        ((JComponent)e.getSource()).setCursor(hc);
        startPt.setLocation(e.getPoint());
        move.setLocation(0, 0);
        scroller.stop();
    }
    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        int notches = e.getWheelRotation();

        if (notches < 0) {
            ind++;
            if(ind <0){ind=0;}
            if(ind<=9){
            str="/resources/"+ind+".png";       
             ChangImage(str);
            System.out.println("indink"+str);
            }
        } else {
            ind--;
            if(ind >9){ind=8;}
            if(ind>=0){
            str="/resources/"+ind+".png";
            ChangImage(str);
            System.out.println("ind"+ind);
            }             
        }   
      }
    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub          
    }

    @Override
    public void mouseMoved(MouseEvent arg0) {
        // TODO Auto-generated method stub
    }
    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub      
    }
    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub      
    }
    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub      
    }
}

//----------------------------------------------------------------- 
}

Dies ist die Hauptklasse:

public class main { 
    public static void main(String[] args) {
        MapFrame.ShowGUI("/resources/0.png");       
    }
}
War es hilfreich?

Lösung

Sie haben zwei Probleme in Ihrem Code:

Der erste:

public static void ChangImage(String pathe){
    frame.getContentPane().add(new MapFrame(pathe));        
    label.revalidate();
    frame.setVisible(true);     
} 

Wenn Sie das Bild ändern (aufgerufen bei einem Mausrad-Ereignis), fügen Sie es einfach hinzu neu Panel (MapFrame) mit Bild zum vorhandenen Container:(Container pane = frame.getContentPane()).Die alten sind noch da und überlappen sich mit dem neuen Panel.Die obige Methode sollte sein:

public static void ChangImage(String pathe) {
    frame.getContentPane().removeAll();
    frame.getContentPane().add(new MapFrame(pathe));
    label.revalidate();
    frame.setVisible(true);
}

Das Zweite:

Warum kompliziert?(Außerdem liegt ein Fehler beim 0-Wert von vor ind):

@Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        int notches = e.getWheelRotation() * -1;
        ind += notches;
        if(ind < 0) {
            ind = 0;
        }
        else if(ind > 9) {
            ind = 9;
        }
        str = "/resources/" + ind + ".png";
        ChangImage(str);
    }

Und das Letzte:

Wenn Sie alle Mausschnittstellen implementieren, können Sie erweitern MouseAdapter.Jetzt müssen Sie keine Methoden überschreiben, die Sie nicht möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top