Swing JScrollbar zentrieren

dhachim

Bekanntes Mitglied
Noch ein Versuch:

Ich versuche die vertikale und die horizontale Scrollbar zu zentrieren.
Das klappt leider nicht wie ich denke. BoundedRangeModel hab ich bereits entdeckt, und irgendwie hat es was damit zu tun.

In dem Code versuche ich erstmal beide Scrollbars ans Ende zu setzen. Horizontal funktioniert es auch. Aber vertikal verhält es sich merkwürdig. Egal was ich bei setValue() setze, das Programm setzt das Value auf 90. Verstehe überhaupt nicht wiso.


Java:
import javax.swing.BoundedRangeModel;
import javax.swing.DefaultBoundedRangeModel;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import java.awt.Dimension;
import java.awt.Rectangle;
import javax.swing.JComboBox;
import java.awt.event.ItemEvent;
import javax.swing.JButton;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Zoomer extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JScrollPane jScrollPane = null;
	private JPanel jPanel = null;
	private JPanel jPanel1 = null;
	private JComboBox jComboBox = null;
	private JScrollBar vert = null;
	private JScrollBar hori = null;
	private JButton jButton = null;

	BoundedRangeModel mdlhori = new DefaultBoundedRangeModel();
	BoundedRangeModel mdlvert = new DefaultBoundedRangeModel();
	private JButton jButton1 = null;

	/**
	 * This is the default constructor
	 */
	public Zoomer() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(500, 500);
		this.setContentPane(getJContentPane());
		this.setTitle("Zoomer");
		vert = jScrollPane.getVerticalScrollBar();
		hori = jScrollPane.getHorizontalScrollBar();

		mdlvert = vert.getModel();
		mdlvert.addChangeListener(new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent e) {
				System.out.println("Scrollposition Vertikal "
						+ mdlvert.getValue());

			}

		});
		mdlhori = hori.getModel();
		mdlhori.addChangeListener(new ChangeListener() {

			@Override
			public void stateChanged(ChangeEvent e) {
				System.out.println("Scrollposition Horizontal "
						+ mdlhori.getValue());

			}

		});

		mdlvert.setValue(mdlvert.getMaximum());
		mdlhori.setValue(mdlhori.getMaximum());

	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(getJScrollPane(), null);
			jContentPane.add(getJPanel1(), null);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jScrollPane
	 * 
	 * @return javax.swing.JScrollPane
	 */
	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane();
			jScrollPane.setBounds(new Rectangle(2, 35, 474, 424));
			jScrollPane.setViewportView(getJPanel());
		}
		return jScrollPane;
	}

	/**
	 * This method initializes jPanel
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(null);
			jPanel.setSize(800, 800);
			jPanel.setPreferredSize(new Dimension(800, 800));
			jPanel.add(getJButton(), null);
		}
		return jPanel;
	}

	/**
	 * This method initializes jPanel1
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJPanel1() {
		if (jPanel1 == null) {
			jPanel1 = new JPanel();
			jPanel1.setLayout(null);
			jPanel1.setBounds(new Rectangle(3, 4, 477, 28));
			jPanel1.add(getJComboBox(), null);
			jPanel1.add(getJButton1(), null);
		}
		return jPanel1;
	}

	/**
	 * This method initializes jComboBox
	 * 
	 * @return javax.swing.JComboBox
	 */
	private JComboBox getJComboBox() {
		if (jComboBox == null) {
			jComboBox = new JComboBox();
			jComboBox.setBounds(new Rectangle(1, 2, 215, 25));
			jComboBox.addItem("100");
			jComboBox.addItem("200");
			jComboBox.addItem("300");
			jComboBox.addItem("400");
			jComboBox.addItem("500");
			jComboBox.addItemListener(new java.awt.event.ItemListener() {
				public void itemStateChanged(java.awt.event.ItemEvent e) {
					if (e.getStateChange() == ItemEvent.SELECTED) {
						int zoom = Integer.parseInt(jComboBox.getSelectedItem()
								.toString()) / 100;
						System.out.println("SetZoom x" + zoom);
						jPanel.setSize(800 * zoom, 800 * zoom);
						jPanel.setPreferredSize(new Dimension(800 * zoom,
								800 * zoom));
						jButton.setBounds(new Rectangle(400 * zoom, 400 * zoom,
								10 * zoom, 10 * zoom));
					}
				}
			});
		}
		return jComboBox;
	}

	/**
	 * This method initializes jButton
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setBounds(new Rectangle(400, 400, 10, 10));
		}
		return jButton;
	}

	/**
	 * This method initializes jButton1
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getJButton1() {
		if (jButton1 == null) {
			jButton1 = new JButton();
			jButton1.setBounds(new Rectangle(282, 6, 90, 16));
			jButton1.setText("calc");
			jButton1.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					System.out.println("MaxVert =  " + mdlvert.getMaximum());
					System.out.println("MaxHori =  " + mdlhori.getMaximum());
					System.out.println("ExtentVert =  " + mdlvert.getExtent());
					System.out.println("ExtentHori =  " + mdlhori.getExtent());
					System.out.println("MinVert =  " + mdlvert.getMinimum());
					System.out.println("MinHori =  " + mdlhori.getMinimum());
				}
			});
		}
		return jButton1;
	}

}
 

dhachim

Bekanntes Mitglied
im Debugging sehe ich
mdlvert entspricht javax.swing.DefaultBoundedRangeModel[value=90, extent=0, min=0, max=800, adj=false]
 

dhachim

Bekanntes Mitglied
ist es überhaupt möglich die Scrollbars, damit meine ich beide mit setValue() zu manipulieren ?

Java:
jScrollPane.getViewport().setViewPosition(new Point(195,195));

Damit geht es, aber irgendwie hab ich dann Schwierigkeiten, die richtigen Werte beim Zoomen zu berechnen.
 

dhachim

Bekanntes Mitglied
Vielleicht interessiert sich ja irgendwann mal jemand für meine Lösung :)
Java:
/**
 * Dieses Programm beinhaltet eine Routine, in einem Panel 
 * zu zoomen.
 * Der Zoomfactor wird in der Combobox eingestellt.
 * 
 * Das Zentrum des Panels soll nach dem Zoomvorgang wieder 
 * das Zentrum sein. 
 * 
 * @author Daniel Hachim
 * @date 19-6-2010
 */

import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ItemEvent;
import javax.swing.BoundedRangeModel;
import javax.swing.DefaultBoundedRangeModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Zoomer extends JFrame {

	private static final long serialVersionUID = 1L;

	// Globale Einstellung der Panelgröße
	private final int PANELX = 900;
	private final int PANELY = 800;

	// 
	private int ZOOMX = 0;
	private int ZOOMY = 0;

	private JPanel jContentPane = null;
	private JScrollPane scroll = null;
	private JPanel panZoom = null;
	private JPanel panTop = null;
	private JComboBox cbZoomFaktor = null;
	private JScrollBar sbVert = null;
	private JScrollBar sbHori = null;
	float lastZoomFactor = 1;

	private JButton btnInfo = null;
	private JButton btnZoomCenter = null;

	BoundedRangeModel mdlhori = new DefaultBoundedRangeModel();
	BoundedRangeModel mdlvert = new DefaultBoundedRangeModel();

	/**
	 * This is the default constructor
	 */
	public Zoomer() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(PANELX / 2 + 20, PANELY / 2 + 100);
		this.setContentPane(getJContentPane());
		this.setTitle("Zoomer");
		this.setResizable(false);
		sbVert = scroll.getVerticalScrollBar();
		sbHori = scroll.getHorizontalScrollBar();

		mdlvert = sbVert.getModel();
		mdlvert.addChangeListener(new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent e) {
				System.out.println("Scrollposition Vertikal "
						+ mdlvert.getValue());

			}

		});
		mdlhori = sbHori.getModel();
		mdlhori.addChangeListener(new ChangeListener() {

			@Override
			public void stateChanged(ChangeEvent e) {
				System.out.println("Scrollposition Horizontal "
						+ mdlhori.getValue());

			}

		});
		// Startposition (ungefähr auf dem Button)
		scroll.getViewport().setViewPosition(new Point(PANELX / 4, PANELY / 4));
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(getJScrollPane(), null);
			jContentPane.add(getJPanel1(), null);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jScrollPane
	 * 
	 * @return javax.swing.JScrollPane
	 */
	private JScrollPane getJScrollPane() {
		if (scroll == null) {
			scroll = new JScrollPane();
			scroll.setBounds(new Rectangle(2, 35, PANELX / 2, PANELY / 2));
			scroll.setViewportView(getJPanel());
		}
		return scroll;
	}

	/**
	 * This method initializes jPanel
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJPanel() {
		if (panZoom == null) {
			panZoom = new JPanel();
			panZoom.setLayout(null);
			panZoom.setSize(PANELX, PANELY);
			panZoom.setPreferredSize(new Dimension(PANELX, PANELY));
			panZoom.add(getJButton(), null);
		}
		return panZoom;
	}

	/**
	 * This method initializes jPanel1
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJPanel1() {
		if (panTop == null) {
			panTop = new JPanel();
			panTop.setLayout(null);
			panTop.setBounds(new Rectangle(3, 4, 477, 28));
			panTop.add(getJComboBox(), null);
			panTop.add(btnInfo(), null);
		}
		return panTop;
	}

	/**
	 * This method initializes jComboBox
	 * 
	 * @return javax.swing.JComboBox
	 */
	private JComboBox getJComboBox() {
		if (cbZoomFaktor == null) {
			cbZoomFaktor = new JComboBox();
			cbZoomFaktor.setBounds(new Rectangle(1, 2, 215, 25));
			cbZoomFaktor.addItem("10");
			cbZoomFaktor.addItem("25");
			cbZoomFaktor.addItem("50");
			cbZoomFaktor.addItem("75");
			cbZoomFaktor.addItem("100");
			cbZoomFaktor.addItem("125");
			cbZoomFaktor.addItem("150");
			cbZoomFaktor.addItem("175");
			cbZoomFaktor.addItem("200");
			cbZoomFaktor.addItem("300");
			cbZoomFaktor.addItem("400");
			cbZoomFaktor.addItem("500");
			cbZoomFaktor.setSelectedIndex(4);
			cbZoomFaktor.addItemListener(new java.awt.event.ItemListener() {
				public void itemStateChanged(java.awt.event.ItemEvent e) {
					if (e.getStateChange() == ItemEvent.SELECTED) {
						zoomIT();
					}

				}
			});
		}
		return cbZoomFaktor;
	}

	/**
	 * Methode, in der die einzelnen Objekte um einen Zoomfaktor verändert
	 * werden.
	 * 
	 * @param zoom
	 */
	public void resizeAll(float zoom) {
		panZoom.setSize((int) (PANELX * zoom), (int) (PANELY * zoom));
		panZoom.setPreferredSize(new Dimension((int) (PANELX * zoom),
				(int) (PANELY * zoom)));
		btnZoomCenter
				.setBounds(new Rectangle((int) (PANELX / 2 * zoom),
						(int) (PANELY / 2 * zoom), (int) (10 * zoom),
						(int) (10 * zoom)));
	}

	/**
	 * Zoom Methode
	 */
	public void zoomIT() {

		float zoom = Float
				.parseFloat(cbZoomFaktor.getSelectedItem().toString()) / 100;
		ZOOMX = mdlhori.getValue();
		ZOOMY = mdlvert.getValue();
		System.out.println("SetZoom x" + zoom);
		float deltaZoom;
		float factor = 0;

		if (zoom < lastZoomFactor) {
			deltaZoom = lastZoomFactor - zoom;
			factor = factor - deltaZoom;
		} else {
			deltaZoom = zoom - lastZoomFactor;
			factor = factor + deltaZoom;
		}

		lastZoomFactor = zoom;

		resizeAll(zoom);
		// calculate x Value
		int addx = PANELX / 2;
		float x = addx * factor;

		// calculate y Value
		int addy = PANELY / 2;
		float y = addy * factor;

		Point p = new Point((int) (ZOOMX + x), (int) (ZOOMY + y));

		scroll.getViewport().setViewPosition(p);
		repaint();

	}

	/**
	 * This method initializes jButton
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getJButton() {
		if (btnZoomCenter == null) {
			btnZoomCenter = new JButton();
			btnZoomCenter.setBounds(new Rectangle(PANELX / 2, PANELY / 2, 10,
					10));
		}
		return btnZoomCenter;
	}

	/**
	 * This method initializes jButton1
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton btnInfo() {
		if (btnInfo == null) {
			btnInfo = new JButton();
			btnInfo.setBounds(new Rectangle(282, 6, 95, 16));
			btnInfo.setText("INFO");
			btnInfo.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					System.out.println("MaxVert =  " + mdlvert.getMaximum());
					System.out.println("MaxHori =  " + mdlhori.getMaximum());
					System.out.println("ExtentVert =  " + mdlvert.getExtent());
					System.out.println("ExtentHori =  " + mdlhori.getExtent());
					System.out.println("MinVert =  " + mdlvert.getMinimum());
					System.out.println("MinHori =  " + mdlhori.getMinimum());
				}
			});
		}
		return btnInfo;
	}

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Swing JScrollBar AWT, Swing, JavaFX & SWT 2
V JScrollBar soll weiterscrollen, wenn Inhalt von JTextArea erweitert wird AWT, Swing, JavaFX & SWT 7
K Swing JScrollPane - JScrollBar anzeigen, wenn Frame verkleinert wird AWT, Swing, JavaFX & SWT 3
R Swing JScrollBar mit JTextField koppeln AWT, Swing, JavaFX & SWT 3
P JScrollBar designen oder unsichtbar machen AWT, Swing, JavaFX & SWT 10
G Swing Value von einer JScrollBar auf eine andere übertragen AWT, Swing, JavaFX & SWT 2
T Swing JScrollBar fetter machen? AWT, Swing, JavaFX & SWT 2
H JScrollBar nicht verstellbar AWT, Swing, JavaFX & SWT 2
B Swing JScrollBar in einem JPanel mit FlowLayout AWT, Swing, JavaFX & SWT 15
A Swing JPanel in JScrollBar scrollbar machen AWT, Swing, JavaFX & SWT 4
D Swing JScrollbar ganz nach unten scrollen AWT, Swing, JavaFX & SWT 2
A JScrollBar durch Button ersetzten AWT, Swing, JavaFX & SWT 2
xehpuk Swing JScrollBar wird nicht eingeblendet, wenn JTable befüllt wird AWT, Swing, JavaFX & SWT 4
B Swing JScrollPane - observen wann eine JScrollBar angezeigt wird? AWT, Swing, JavaFX & SWT 5
V Position der JScrollBar ändern AWT, Swing, JavaFX & SWT 5
N Swing JTextArea/JScrollpane: JScrollbar position AWT, Swing, JavaFX & SWT 8
Asamandra Benutzerdefinierte JScrollBar AWT, Swing, JavaFX & SWT 4
1 Eigene Component in JScrollBar + fixe Linien??? AWT, Swing, JavaFX & SWT 2
Pithecanthropus Swing JScrollBar-Position festlegen.. AWT, Swing, JavaFX & SWT 3
R JScrollBar - Immer drei Zeilen weiter AWT, Swing, JavaFX & SWT 10
R JScrollBar mit eigenem look and feel AWT, Swing, JavaFX & SWT 6
C JScrollpane eigenen jScrollBar einfügen AWT, Swing, JavaFX & SWT 2
R JScrollBar / JScrollPane: Ermitteln ob ganz unten AWT, Swing, JavaFX & SWT 2
F JScrollbar Verschiebung des Viewport ermitteln AWT, Swing, JavaFX & SWT 3
M JScrollbar + JTable + Zeilen wie in Excel hinzufügen AWT, Swing, JavaFX & SWT 14
M JScrollbar + Adjustmentlistener + Button AWT, Swing, JavaFX & SWT 3
M Listener für Button auf JScrollbar AWT, Swing, JavaFX & SWT 10
J JScrollBar scroll-Verhalten auf 2 JButtons umleiten? AWT, Swing, JavaFX & SWT 2
J JScrollBar lässt sich nicht auf minimum setzten AWT, Swing, JavaFX & SWT 7
T JScrollbar UI verändern AWT, Swing, JavaFX & SWT 5
D Problem mit JScrollBar, AutoScroll und JTextArea AWT, Swing, JavaFX & SWT 2
B horizontale bzw. vertikale JScrollBar breite von JScrollPane AWT, Swing, JavaFX & SWT 5
loadbrain Mehrer Panesl: JScrollBar, JScrollPane? AWT, Swing, JavaFX & SWT 9
K JTextArea + JScrollBar AWT, Swing, JavaFX & SWT 11
B Setzen von Position > 90 bei JScrollbar nicht möglich AWT, Swing, JavaFX & SWT 3
V Farben setzen bei einigen Komponenten (JScrollBar, . AWT, Swing, JavaFX & SWT 3
P Breite eines JScrollbar vergrößern, aber wie? AWT, Swing, JavaFX & SWT 8
M JScrollbar bei einer JTable AWT, Swing, JavaFX & SWT 5
L JScrollBar AWT, Swing, JavaFX & SWT 3
B Problem mit der Kombination von JScrollBar und JTextArea AWT, Swing, JavaFX & SWT 2
S Anzeige-Wirrwar in JScrollbar AWT, Swing, JavaFX & SWT 3
B Listener entfernen bei JScrollbar AWT, Swing, JavaFX & SWT 6
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
Hatsi09 Kinofilm zentrieren AWT, Swing, JavaFX & SWT 3
MrSnake Zahlen in Tabellenzelle zentrieren AWT, Swing, JavaFX & SWT 3
S JavaFX MenuItem in hoher (height größer) MenuBar vertikal zentrieren AWT, Swing, JavaFX & SWT 4
OlafHD JLabel im JFrame Zentrieren AWT, Swing, JavaFX & SWT 2
stylegangsta JLabel anzuzeigenden Text zentrieren AWT, Swing, JavaFX & SWT 9
V Anwendung im Vollbild zentrieren AWT, Swing, JavaFX & SWT 13
M Swing Jtable zellen zentrieren AWT, Swing, JavaFX & SWT 4
H Gif Animationen zentrieren AWT, Swing, JavaFX & SWT 9
P Rectangle on JPanel zentrieren AWT, Swing, JavaFX & SWT 20
C jPanel auf jScrollPane zentrieren AWT, Swing, JavaFX & SWT 3
reibi SWT Bild auf Composite zentrieren AWT, Swing, JavaFX & SWT 7
U Elemente im Panel zentrieren mit GridLayout AWT, Swing, JavaFX & SWT 3
B 2D-Grafik Text in einem Kreis zentrieren AWT, Swing, JavaFX & SWT 3
S Swing Component vertikal und hochizontal zentrieren? AWT, Swing, JavaFX & SWT 5
T Text in JTextPane vertikal (!) zentrieren AWT, Swing, JavaFX & SWT 4
D JTabbedPane zentrieren AWT, Swing, JavaFX & SWT 2
N JPanel vertikal im BorderLayout zentrieren AWT, Swing, JavaFX & SWT 2
B setTitle() Titel zentrieren AWT, Swing, JavaFX & SWT 7
K Panel zentrieren AWT, Swing, JavaFX & SWT 10
Y JTable Zelleninhalt zentrieren AWT, Swing, JavaFX & SWT 2
hdi SWT Label Text vertikal zentrieren AWT, Swing, JavaFX & SWT 6
J Bilder in JScrollPane zentrieren AWT, Swing, JavaFX & SWT 5
C Swing Text vertikal zentrieren??? AWT, Swing, JavaFX & SWT 3
G Zentrieren mittels setLocationRelativeTo(null);? AWT, Swing, JavaFX & SWT 14
K Mainframe zentrieren AWT, Swing, JavaFX & SWT 4
T Divider zentrieren bei Gui Start AWT, Swing, JavaFX & SWT 21
DeeDee0815 SWT Label horizontal und vertikal zentrieren AWT, Swing, JavaFX & SWT 7
G BorderLayout - zentrieren AWT, Swing, JavaFX & SWT 1
M JSplitPane ein JPanel hinzufügen und zentrieren. AWT, Swing, JavaFX & SWT 9
M Makierten Text in JTextPane zentrieren AWT, Swing, JavaFX & SWT 2
G JScrollpage: Viewport beim Zoomen immer relative zentrieren AWT, Swing, JavaFX & SWT 5
S Text in einem JLabel zentrieren AWT, Swing, JavaFX & SWT 4
F [SWT] Buttons vertikal zentrieren AWT, Swing, JavaFX & SWT 7
Noar Infofenster zentrieren und HTML-formatierten Text readonly a AWT, Swing, JavaFX & SWT 7
A Zentrieren von drawstring() in einem fillRect() AWT, Swing, JavaFX & SWT 3
W jInternal Frame Zentrieren AWT, Swing, JavaFX & SWT 10
L JTable - zentrieren AWT, Swing, JavaFX & SWT 7
V JTable: Spalteninhalt zentrieren AWT, Swing, JavaFX & SWT 2
K JInternalFrame: internes Fenster zentrieren AWT, Swing, JavaFX & SWT 2
G Text zentrieren in einem JTextField ? AWT, Swing, JavaFX & SWT 2
L Programmfenster zentrieren . AWT, Swing, JavaFX & SWT 5
S Fenster zentrieren AWT, Swing, JavaFX & SWT 11
M Frame zentrieren AWT, Swing, JavaFX & SWT 9
M Image auf Button zentrieren AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben