Swing Horizontales Scrollen mit Shift-Mausrad

Petra19

Mitglied
Hallo zusammen,

ich bin immer noch mit den Scrollbalken beschäftigt.

Ich möchte mit der Shift-Mausrad-Kombination horizontal scrollen. Hierzu habe ich zwei Ansätze ausprobiert. Einmal mit
Java:
else if(evt.isShiftDown()){
  location.x+=UNIT_INCREMENT*evt.getWheelRotation();
  if (location.x<0)  location.x=0;
  //Obere Grenze fehlt
  scrollPane.getHorizontalScrollBar().setValue(location.x);
}
In diesem Fall wird zuerst nach oben bzw. nach unten gescrollt. Ich möchte aber mit Shift-Mausrad nur nach rechts bzw. links scrollen.

Mein zweiter Ansatz stellt mich ebenfalls nicht zufrieden, da sich das Bild beim Scrollen kurz nach oben bewegt. Ich vermute, dass ich mit dem Mausrad vertikal scrolle und anschl. die Position mit setViewPosition() wieder verändere.
Java:
else if(evt.isShiftDown()){
  location.x+=UNIT_INCREMENT*evt.getWheelRotation();
  if (location.x<0)  location.x=0;
  //Obere Grenze fehlt
  scrollPane.getViewport().setViewPosition(location);
  }
  else{
  location.y+=UNIT_INCREMENT;
  if (location.y<0) location.y=0;
  //Obere Grenze fehlt
  }

Leider weiß ich nicht, wie ich das ändern kann.

Weiter weiß ich nicht, wie ich location.x (location.y) nach oben begrenzen kann. Mit getWidth(), oder getMaximum() komme ich nicht weiter, da ich nicht die Breite des Scrollbalkens, der sich je nach Größe von MyPanel ändert. Auch hier könnte ich einen Hinweis brauchen.

Vielen Dank für eure Hilfe!


Hier nun mein Quellcode:
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class ScrollAndZoomExample {
  public static void main(String[] args) {
  final int UNIT_INCREMENT=25;
  JFrame f = new JFrame();
  f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  DrawingPanel myPanel=new DrawingPanel();
   
  Point location=new Point(0,0);
   
  JScrollPane scrollPane=new JScrollPane();
  scrollPane.getViewport().setView(myPanel);
  scrollPane.getHorizontalScrollBar().setUnitIncrement(UNIT_INCREMENT);
  scrollPane.getVerticalScrollBar().setUnitIncrement(UNIT_INCREMENT);
  scrollPane.addMouseWheelListener(new MouseWheelListener() {
   @Override
   public void mouseWheelMoved(MouseWheelEvent evt) {
    if (evt.isControlDown()) {
      myPanel.setScale(evt.getWheelRotation());
    }
    else if(evt.isShiftDown()){
      location.x+=UNIT_INCREMENT*evt.getWheelRotation();
      if (location.x<0)  location.x=0;
      //Obere Grenze fehlt
      scrollPane.setAutoscrolls(false);
      scrollPane.getHorizontalScrollBar().setValue(location.x);
    }/*
      scrollPane.getViewport().setViewPosition(location);
    }
    else{
      location.y+=UNIT_INCREMENT;
      if (location.y<0) location.y=0;
      //Obere Grenze fehlt
    }*/
   }
  });
  f.getContentPane().setLayout(new BorderLayout());
  f.getContentPane().add(scrollPane,BorderLayout.CENTER);
  f.setSize(400, 400);
  f.setLocation(200,200);
  f.setVisible(true);
  }
}


class DrawingPanel extends JPanel{
  int scale;
  int width=100;
  int height=100;
   
  public DrawingPanel(){
  scale= 1;
  setPreferredSize(new Dimension(100,100));
   
  }
  protected void paintComponent(Graphics g) {
  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D)g;
  g2.scale(scale,scale);
  g2.draw(new Ellipse2D.Double(10, 10, 20, 20));
  g2.draw(new Ellipse2D.Double(10, 10, 40, 40));
  g2.draw(new Ellipse2D.Double(10, 10, 60, 60));
  g2.draw(new Rectangle(0,0,width,height));
 }
   
  public void setScale(int s){
  scale=scale-s;
  if (scale<1) scale=1;
  else if (scale>15) scale=15;
  setPreferredSize(new Dimension(width*scale, height*scale));
  revalidate();
  repaint();
  }
}
 

Thallius

Top Contributor
Ohne das jetzt feoß nachgesehen zu haben. Gibt es keine Möglichkeit von JScrollPane anzuleiten und die entsprechenden Methode zu überschreiben die die Scrollen oder das Scrolling steuern ?

Gruß

Claus
 

Petra19

Mitglied
Hallo zusammen,

'habe noch weiter im Forum gestöbert und bin auf den folgenden Artikel gestoßen: http://www.java-forum.org/thema/scrollen-per-mousedragged-jscrollpane.72156/

Dieser lieferte mir die Lösung für meine beiden Probleme.
1.) Ausschalten des Scrollens mit Mausrad (scrollPane.setWheelScrollingEnabled(false);)
2.) Mit der Methode getViewPort.getExtentSize() erhalte ich die notwendigen Werte zur Begrenzung des Maximums für die Variablen location.x bzw. location.y

Vielen Dank euch Allen.

Hier nun der endgültige Quellcode:
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JViewport;

public class ScrollAndZoomExample {
  public static void main(String[] args) {
  final int UNIT_INCREMENT=25;
  JFrame f = new JFrame();
  f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  DrawingPanel myPanel=new DrawingPanel();
   
  Point location=new Point(0,0);
   
  JScrollPane scrollPane=new JScrollPane();
  scrollPane.getViewport().setView(myPanel);
  scrollPane.getHorizontalScrollBar().setUnitIncrement(UNIT_INCREMENT);
  scrollPane.getVerticalScrollBar().setUnitIncrement(UNIT_INCREMENT);
   
  scrollPane.setWheelScrollingEnabled(false);
   
  scrollPane.addMouseWheelListener(new MouseWheelListener() {
    @Override
    public void mouseWheelMoved(MouseWheelEvent evt) {
    JViewport v = scrollPane.getViewport();
    Dimension extentSize = v.getExtentSize();
    Dimension  viewSize= v.getView().getSize();
    if (evt.isControlDown()) {
      myPanel.setScale(evt.getWheelRotation());
    }
    else if(evt.isShiftDown()){
      location.x+=UNIT_INCREMENT*evt.getWheelRotation();
      if (location.x<0)  location.x=0;
      else if(location.x>viewSize.width-extentSize.width) location.x=viewSize.width-extentSize.width;
   
      scrollPane.getHorizontalScrollBar().setValue(location.x);
    }
    else{
      location.y+=UNIT_INCREMENT*evt.getWheelRotation();
      if (location.y<0) location.y=0;
      else if(location.y>viewSize.height-extentSize.height) location.y=viewSize.height-extentSize.height;
      scrollPane.getVerticalScrollBar().setValue(location.y);
    }
  }
  });
  f.getContentPane().setLayout(new BorderLayout());
  f.getContentPane().add(scrollPane,BorderLayout.CENTER);
  f.setSize(400, 400);
  f.setLocation(200,200);
  f.setVisible(true);
  }
}


class DrawingPanel extends JPanel{
  int scale;
  int width=100;
  int height=100;
   
  public DrawingPanel(){
  scale= 1;
  setPreferredSize(new Dimension(100,100));
   
  }
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;
    g2.scale(scale,scale);
    g2.draw(new Ellipse2D.Double(10, 10, 20, 20));
    g2.draw(new Ellipse2D.Double(10, 10, 40, 40));
    g2.draw(new Ellipse2D.Double(10, 10, 60, 60));
    g2.draw(new Rectangle(0,0,width,height));
  }
   
  public void setScale(int s){
    scale=scale-s;
    if (scale<1) scale=1;
    else if (scale>15) scale=15;
    setPreferredSize(new Dimension(width*scale, height*scale));
    revalidate();
    repaint();
  }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
P kein Scrollen nach affinertransformation bei mouse dragged AWT, Swing, JavaFX & SWT 2
S JavaFX JavaFX TableView scrollen färbt falsche Zeilen AWT, Swing, JavaFX & SWT 1
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
J JList scrollen AWT, Swing, JavaFX & SWT 3
Bluedaishi JTextArea gefundene Zeile nach Oben Scrollen AWT, Swing, JavaFX & SWT 13
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
W JavaFX Scrollpane elementweise scrollen AWT, Swing, JavaFX & SWT 4
Thallius Automatisches Scrollen zum aktiven JTextView klappt nicht AWT, Swing, JavaFX & SWT 2
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
W Swing Zum Ende einer Scrollpane scrollen AWT, Swing, JavaFX & SWT 2
S JScrollPane --> Programm hängt sich beim scrollen auf AWT, Swing, JavaFX & SWT 2
S JavaFX Mehrere TreeTableView's synchron scrollen AWT, Swing, JavaFX & SWT 0
O Tabelle "animiert" Scrollen AWT, Swing, JavaFX & SWT 1
O Swing JTable per Scrollen füllen! AWT, Swing, JavaFX & SWT 7
J AWT choice mit viel Auswahl aktualisiert sich nicht korrekt beim scrollen?! AWT, Swing, JavaFX & SWT 3
P Durch Bilder Scrollen AWT, Swing, JavaFX & SWT 2
U Swing JPane und JScrollpane in JSplitpane-Seite: Scrollen funktioniert nicht AWT, Swing, JavaFX & SWT 3
J JTable wird bei scrollen falsch gezeichnet AWT, Swing, JavaFX & SWT 3
N Touchscreen-Scrollen, wo liegt der Fehler? AWT, Swing, JavaFX & SWT 3
S Swing Scrollpanes: wie kann ich durch Java-Code an den "Anfang" scrollen AWT, Swing, JavaFX & SWT 8
G JTable zentriert scrollen AWT, Swing, JavaFX & SWT 2
D SWING - Ein Composite scrollen AWT, Swing, JavaFX & SWT 6
S Canvas in ScrollPane wird beim scrollen immer neu gezeichnet AWT, Swing, JavaFX & SWT 3
D Swing JScrollbar ganz nach unten scrollen AWT, Swing, JavaFX & SWT 2
K SWT treeviewer scrollen AWT, Swing, JavaFX & SWT 8
F Swing Mehrere Textfelder in Scrollpane einfügen und dann zum Scrollen bringen? AWT, Swing, JavaFX & SWT 4
J Lazy Loading eine JTree während Scrollen AWT, Swing, JavaFX & SWT 11
A Swing Scrollen über JPane AWT, Swing, JavaFX & SWT 20
Dit_ JTextArea zu Zeile X scrollen AWT, Swing, JavaFX & SWT 4
S SWT Zwei Tabellen gleichzeitig Scrollen AWT, Swing, JavaFX & SWT 3
Dragonfire Swing JPanel nur vertikal scrollen AWT, Swing, JavaFX & SWT 4
hdi SWT ScrolledComposite -> Nix mit Scrollen? AWT, Swing, JavaFX & SWT 8
T In einem Label scrollen AWT, Swing, JavaFX & SWT 3
A Swing JScrollPane ans ende Scrollen AWT, Swing, JavaFX & SWT 9
W SwingX Problem mit Scrollen von 2 JXTaskPaneContainer AWT, Swing, JavaFX & SWT 3
S Swing Scrollen ohne Leiste? AWT, Swing, JavaFX & SWT 2
J wie Scrollen? AWT, Swing, JavaFX & SWT 3
R Zu selektiertem Column in JTable scrollen? AWT, Swing, JavaFX & SWT 2
P Drei Scrollpanes gleichzeitig scrollen AWT, Swing, JavaFX & SWT 3
G Scrollen per mouseDragged (JScrollPane) AWT, Swing, JavaFX & SWT 8
H jScrollPane ohne Scrollen AWT, Swing, JavaFX & SWT 2
G Mehrere JScrollPanes gekoppelt scrollen AWT, Swing, JavaFX & SWT 2
G JTable in JScrollPane - nach unten scrollen AWT, Swing, JavaFX & SWT 11
S JList automatisch scrollen AWT, Swing, JavaFX & SWT 8
D JScrollPane incl. thumbnails, soll fluessig scrollen! AWT, Swing, JavaFX & SWT 3
J JScrollPane soll automatisch zu einem punkt scrollen AWT, Swing, JavaFX & SWT 4
P JPopupMenu scrollen AWT, Swing, JavaFX & SWT 2
J JList Scrollen AWT, Swing, JavaFX & SWT 8
M PerformanceProbleme(Beim Scrollen ruckelt es) AWT, Swing, JavaFX & SWT 16
Z JTable automatisch zu einer Zeile scrollen AWT, Swing, JavaFX & SWT 4
D JScrollPane mit Grafiken scrollen lassen AWT, Swing, JavaFX & SWT 2
G 3 oder mehr JTable nebeneinander gleichzeitig vert. scrollen AWT, Swing, JavaFX & SWT 4
R JTextPane scrollen vermeiden AWT, Swing, JavaFX & SWT 2
S JScrollPane > JPanel - automatisch scrollen AWT, Swing, JavaFX & SWT 2
R Einstellen der Maus Rad Geschwindigkeit beim Scrollen AWT, Swing, JavaFX & SWT 3
I In JPopupMenu scrollen AWT, Swing, JavaFX & SWT 4
S Scrollen AWT, Swing, JavaFX & SWT 2
Q ||| Scrollen mal anders - Console mitscrollender Text??? AWT, Swing, JavaFX & SWT 6
G Problem mit horizontal und vertikal scrollen AWT, Swing, JavaFX & SWT 2
M Scrollen - Geschwindigkeit - Scrollgeschwindigkeit AWT, Swing, JavaFX & SWT 2
G JScrollPane - scrollen mit Pfeiltasten AWT, Swing, JavaFX & SWT 3
J Wie kann man beim BoxLayout scrollen? Keine Scrollleiste!:-( AWT, Swing, JavaFX & SWT 7
R JTable zu einem bestimmten Eintrag automatisch scrollen? AWT, Swing, JavaFX & SWT 2
A Scrollpane verschmiert beim scrollen AWT, Swing, JavaFX & SWT 5
S Position von Labels, Buttons, etc. festsetzen und Scrollen AWT, Swing, JavaFX & SWT 4
N JTable scrollen AWT, Swing, JavaFX & SWT 4
F 3 JTextAreas zusammen scrollen AWT, Swing, JavaFX & SWT 5
O JScrollPane beinhaltet JPanel mit null Layout kein Scrollen AWT, Swing, JavaFX & SWT 3
G Scrollen ohne scrolleisten AWT, Swing, JavaFX & SWT 5
T JTextPane in JScrollPane NICHT autom. nach unten scrollen AWT, Swing, JavaFX & SWT 3
M JScrollPane immer bis ganz nach unten scrollen lassen AWT, Swing, JavaFX & SWT 5
J Streifen beim Scrollen AWT, Swing, JavaFX & SWT 3
F Scrollen bei JTextArea in einem Null-Layout? Unmöglich? AWT, Swing, JavaFX & SWT 4
M JScrollPane soll automatisch scrollen AWT, Swing, JavaFX & SWT 5
N JScrollPane schneller scrollen AWT, Swing, JavaFX & SWT 3
V Automatisches Scrollen bei JScrollPane AWT, Swing, JavaFX & SWT 10
N Scrollen in einem Panel AWT, Swing, JavaFX & SWT 5
S jScrollPane ganz nach unten scrollen AWT, Swing, JavaFX & SWT 4
B In JScrollPane eingebettetes JEditorPane scrollen AWT, Swing, JavaFX & SWT 2
M Scrollprobleme - Panelinhalte bleiben beim Scrollen AWT, Swing, JavaFX & SWT 2
Z JTextArea in JScrollPane automatisch scrollen AWT, Swing, JavaFX & SWT 2
K JPanle scrollen . AWT, Swing, JavaFX & SWT 2
V Probleme beim Scrollen ein JPanels mit JScrollPane AWT, Swing, JavaFX & SWT 2
G JTable automatisch scrollen AWT, Swing, JavaFX & SWT 4
S Automatisches Scrollen in einer JTextArea AWT, Swing, JavaFX & SWT 6
A Scrollen von Fenster geht nicht AWT, Swing, JavaFX & SWT 4
hdi Shift Modifier zur Laufzeit ermitteln AWT, Swing, JavaFX & SWT 3
A Shift-Tab-Event auslösen AWT, Swing, JavaFX & SWT 5
1 Java.awt.Robot Problem beim Shift-Druck AWT, Swing, JavaFX & SWT 5
R JTable mehrere Zellen mit Shift selektieren AWT, Swing, JavaFX & SWT 2
G Shift + Ende auf JTable AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben