JViewPort

Status
Nicht offen für weitere Antworten.

mu

Aktives Mitglied
Kann ich mittels JViewPort die Seiten zählen die schon gescrollt wurden?

wenn ja, wie? - welche methoden brauche ich dazu.

/mu
 

mu

Aktives Mitglied
Also einbischen zum verdeutlichen
ich habe ein programm das die ganze zeit was ausgibt wenn ich es starte.

getViewport() is 1 seite.
ich will wissen wieviele seiten es insgesammt sind auch die seiten die gescrollt sind, bzw nicht mehr sichtbar.
 

mu

Aktives Mitglied
weiss keiner was?
weiss keiner was ich meine?
weiss keiner ob das überhaupt geht?
weiss keiner das ich was geschrieben habe?
weiss keiner ob das die richtige methode ist um die seiten zu zählen?
 

mu

Aktives Mitglied
Wenn die darunterliegende Komponente die Grösse ändert, soll
in der Konsole angezeigt werden auf welcher "Seitenzahl" sich gerade die Sicht bezieht.

wenn hier ein event reinkommt, bzw etwas passiert. wie gehe ich da vor?
ich will ja nicht mal nen beispielcode oder ähnliches.. nur ein denkanstoss oder ne mögliche lösung(kein code) wie das gehen könnte

Code:
public void componentResized(ComponentEvent event)
{

}

irgendwie muss es doch möglich sein den wert von jviewport().getsize() iiirrgggeennddwiiee in eine variable zu speichern, und dieser variable den wert von 1 seite zuzuweisen.
oder liege ich da ganz falsch?

/mu
 

mu

Aktives Mitglied
also..

Ich habe ein ganz simples GUI, welches ein thread startet, der mir die ganze zeit text einliest..

Ich habe 3 Klassen.

1. die threadklasse.. wo der thread halt programmiert ist.
2. GUI - wo ich "Start" klicke um thread zu starten. Das GUI hat noch 2 andere Buttons "Seiten Zählen" und "Aktuelle Seite". Jeder der Buttons ruft eine Methode im View auf, die im moment noch nichts macht.
3. ViewKlasse - welches ein JScrollPane ist, ausserdem implementiert diese Klasse einen ComponentListener.

Alles was ich fertig programmieren muss ist noch in der ViewKlasse.

Wenn die darunterliegende Komponente die Grösse ändert, wird in die Konsole angezeigt auf welcher "Seitenzahl" sich gerade die Sicht bezieht.

Also meine Überlegung war, den Wert von:

Code:
viewport.getSize();

in einer Variabel zu speichern und diese variabel als "eine Seite" zu initialisieren.

Ich weiss nicht ob das der richtige weg ist, hat jemand von euch sowas schonmal gemacht?

Bin über jede antwort dankbar.
/mu
 

Ariol

Top Contributor
Ok, jetzt ist das Ganze verständlich.

Hier mal ein Beispielcode:
Code:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Main extends JFrame
{
	public static void main(String[] args)
	{
		Main m = new Main();
		m.setLayout(new FlowLayout(FlowLayout.CENTER));
		final JScrollPane sp = new JScrollPane();
		final JPanel p = new JPanel();
		p.setPreferredSize(new Dimension(100, 1000));
		sp.setViewportView(p);
		sp.setPreferredSize(new Dimension(120, 100));

		JButton b = new JButton("Berechner");
		b.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				Rectangle viewRect = sp.getViewport().getViewRect();
				int scrollHeight = sp.getHeight();

				int page = (int) Math.round(((viewRect.y + viewRect.height) / scrollHeight) + 0.5);
				int total = (int) Math.round((p.getHeight() / scrollHeight) + 0.5);
				System.out.println(page + "/" + total);
			}

		});

		m.add(sp);
		m.add(b);

		// m.setPreferredSize(new Dimension(110,120));
		m.pack();
		m.setVisible(true);
		m.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
}
 

Ariol

Top Contributor
War ein kleiner Fehler in der Berechnung - du bekommst eine Seite zuviel.

Hier die bessere Version:
Code:
b.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				int yPosition = sp.getViewport().getViewRect().y;
				int scrollHeight = sp.getHeight();
				int totalHeight = p.getHeight();

				int page = (int) Math.round(((yPosition + scrollHeight) / scrollHeight));
				int total = (int) Math.round(( totalHeight / scrollHeight));
				System.out.println(page + "/" + total);
			}

		});
 

mu

Aktives Mitglied
yop, habs eben auch gesehen.

ich hab noch was eingebaut

Code:
if(bar.getValue() + bar.getHeight() >= bar.getMaximum()-50)
		{
			bar.setValue(bar.getMaximum());
		}

damit, wenn ich den text, der schon da steht, lesen will, kann ich ganz normal hochscrollen und ihn ankucken ohne das es mir automatisch runter scrollt.

ahm eine frage noch.
Ich würd gern einstellen
wenn sich die Sicht noch teilweise auf der Letzten Seite ist,
soll auf das Maximum heruntergescrollt werden.

wie gehe ich da vor?
 

Ariol

Top Contributor
So ganz habe ich nicht verstanden was du meinst (bzw. weswegen)...

Wie findest du das?
Code:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class Main extends JFrame
{
	public static void main(String[] args)
	{
		Main m = new Main();
		m.setLayout(new FlowLayout(FlowLayout.CENTER));
		final JScrollPane sp = new JScrollPane();
		final JPanel p = new JPanel();
		p.setPreferredSize(new Dimension(100, 2000));

		final JLabel label = new JLabel("");
		label.setPreferredSize(new Dimension(50, 20));

		p.setLayout(new GridLayout(0, 1));
		for (int i = 1; i <= 100; i++)
		{
			p.add(new JLabel("" + i));
		}

		sp.setViewportView(p);
		sp.setPreferredSize(new Dimension(120, 100));
		sp.setAutoscrolls(false);
		
		sp.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener()
		{

			public void adjustmentValueChanged(AdjustmentEvent e)
			{
				int yPosition = sp.getViewport().getViewRect().y;
				int scrollHeight = sp.getHeight();
				int totalHeight = p.getHeight();

				int page = (int) Math.round(((yPosition + scrollHeight) / scrollHeight));
				int total = (int) Math.round((totalHeight / scrollHeight));
				label.setText(page + "/" + total);
			}

		});

		m.add(sp);
		m.add(label);

		// m.setPreferredSize(new Dimension(110,120));
		m.pack();
		m.setVisible(true);
		m.setDefaultCloseOperation(EXIT_ON_CLOSE);

		SwingUtilities.invokeLater(new Runnable()
		{
			public void run()
			{
				sp.getVerticalScrollBar().setUnitIncrement(sp.getSize().height);

				int yPosition = sp.getViewport().getViewRect().y;
				int scrollHeight = sp.getHeight();
				int totalHeight = p.getHeight();

				int page = (int) Math.round(((yPosition + scrollHeight) / scrollHeight));
				int total = (int) Math.round((totalHeight / scrollHeight));
				label.setText(page + "/" + total);
			}
		});
	}
}
 
Status
Nicht offen für weitere Antworten.

Oben