[java] Vreemd gedrag JScrollPane?

Pagina: 1
Acties:

  • traviandus
  • Registratie: Februari 2001
  • Laatst online: 25-03-2025
Zie hier de volgende code, onderdeel van mijn eigen Swing component. Deze JComponent ligt in een JScrollPane.
code:
1
2
3
4
5
6
if ( r.x + r.width <= getSize().width ) {
  scrollRectToVisible(r);
  Rectangle r2 = new Rectangle(getVisibleRect());
  if (!r2.equals(r)) {
  System.out.println("We should never reach this point!");
}

Als ik het goed heb mag de tekst "We should never reach this point!" nooit verschijnen. En dit gebeurt dus wel in sommige situaties (r.x != r2.x).

Zie ik hier iets over het hoofd :? of is dit een bug in Java.

Ik gebruik java 1.3.1

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Zie de docs:
public void scrollRectToVisible(Rectangle contentRect)

Scrolls the view so that Rectangle within the view becomes visible.

Note that this method will not scroll outside of the valid viewport; for example, if contentRect is larger than the viewport, scrolling will be confined to the viewport's bounds
Er wordt dus alleen getracht om contentRect visible te maken. Het is daarna dus niet percee de visible rect om twee redenen:

1. Als de contentRect kleiner is dan de grootte van viewport is de visible rect groter. Deze methode maakt alleen de content rect zichtbaar.

2. Zie de note in de quote (dat rijmt ;) ).

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Toevoeging: je moet dus eigenlijk checken of de contentRect in de visible rect valt en of de content rect kleiner is dan de visible rect. Als dat zo is zou je System.out statement pas niet meer worden bereikt.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • traviandus
  • Registratie: Februari 2001
  • Laatst online: 25-03-2025
Op vrijdag 09 november 2001 11:18 schreef mbravenboer het volgende:
Zie de docs:
[..]

Er wordt dus alleen getracht om contentRect visible te maken. Het is daarna dus niet percee de visible rect om twee redenen:

1. Als de contentRect kleiner is dan de grootte van viewport is de visible rect groter. Deze methode maakt alleen de content rect zichtbaar.
In mijn geval geldt dat beide Rectangles van gelijke grootte zijn. Ik had iets vollediger moeten zijn. Zie onder.
2. Zie de note in de quote (dat rijmt ;) ).
contentRect is in mijn geval net zo groot als visibleRect.
(btw. deze note staat niet in de jdk1.3.1 docs.)

Ik zal de code iets uitgebreider posten:
code:
1
2
3
4
5
6
7
8
9
10
11
Rectangle r = new Rectangle(getVisibleRect());
r.x = trX; // only change position
r.y = trY;
if ( r.x + r.width <= getSize().width ) {
  scrollRectToVisible(r);
  Rectangle r2 = new Rectangle(getVisibleRect());
  if (!r2.equals(r)) {
   System.out.println("We should never reach this point!");
   System.out.println("r: "+r+", r2: "+r2);
  }
}

Een voorbeeldje van de output. Het is opvallend dat dit alleen bij 'grootte' waarden gebeurt.
code:
1
2
3
We should never reach this point!
r: java.awt.Rectangle[x=6718,y=6800,width=768,height=614],
r2: java.awt.Rectangle[x=5883,y=6800,width=768,height=614]

:?

edit: las net je toevoeging. Hij valt dus niet in de visibleRect. In de jdk1.3.1 is dat volgens de docs ook niet nodig

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
traviandus: In mijn geval geldt dat beide Rectangles van gelijke grootte zijn. Ik had iets vollediger moeten zijn. Zie onder.
Ah ja, door je nieuwe code en de System.out zie ik inderdaad wat er mis gaat. Merkwaardig :? .

Misschien moet je eens proberen om iets met setViewPosition(..) te doen. Je kunt daarmee misschien de afwijkende X goed zetten. Je code wordt dan ook een stukje eenvoudiger... Dat gedoe met Rectangles en de visible rect is helaas niet al te duidelijk gespecificeerd in de API.
Een voorbeeldje van de output. Het is opvallend dat dit alleen bij 'grootte' waarden gebeurt.
Misschien heeft het iets met de aanwezigheid van scrollbars te maken?

Over de docs: de code is denk ik precies hetzelfde in 1.3.1 en 1.4.0. Ik vermoed dat de note gewoon een extra toevoeging is in de API documentatie om een onduidelijkheid op te heffen. Hij zal dus ook wel in 1.3.1 van toepassing zijn.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • traviandus
  • Registratie: Februari 2001
  • Laatst online: 25-03-2025
Ik heb setViewPosition() gebruikt en nu gaat het perfect :) En inderdaad is de code een stukje eenvoudiger nu.

Thanx!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
traviandus: Ik heb setViewPosition() gebruikt en nu gaat het perfect :) En inderdaad is de code een stukje eenvoudiger nu.
Mooi :) . Oorzaak niet echt achterhaald, maar probleem in ieder geval opgelost ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment

Pagina: 1