GWT: how do I scroll to the bottom of the page? - java

On my page I have a panel which is hidden by default. I can show it via myPanel.setVisible(true) when necessary. After this the height of the window is increased and the window scrollbar appears.
The problem is that the window is not scrolled to the bottom automatically, which is a desired behaviour. How can I fix it? I just want to scroll my page to the bottom.
I know Window.scrollTo (LEFT, TOP) can help me. But the problem is that I dont know how can I calculate the height of the page relative to the top - the second parameter I need to provide to this method. I really tried numerous ways:
Window.getClientHeight();
Document.get().getScrollHeight();
Document.get().getBody().getOffsetHeight();
Document.get().getBody().getAbsoluteBottom();
First two of them do not change their value after the hidden panel becomes visible. The second pair gives me 0 and 8 (???) values.
So how can I solve my issue?
ps
If the situation is a bit different and I have a div with a scrollbars, not the window scrollbars, is it possible to scroll it to the bottom programmatically?

You can use setVerticalScrollPostion API and set the position of the scroll

Is it simple Panel or some subclass of it.
In any case, try first with:
int top = myPanel.getAbsoluteTop();
and then scroll to some value aggregated with top.
From API:
public int getAbsoluteTop()
Gets the object's absolute top position in pixels, as measured from the browser window's client area.

For scrolling down the document, you should use the scrollTo method in Window object, i.e.:
Window.scrollTo(0, Window.getScrollTop() + Window.getClientHeight());

You actually do not need to know the size of the page to scroll to it's bottom. Just use
Window.scrollTo(0, Integer.MAX_VALUE);
At least this always worked for me.

If you want , you can create a widget handle with an id.
For example : widget.getElement().setId("scrollPanel");
Then you can scroll the view on the widget with Document.get().getElementById("scrollPanelFooter").scrollIntoView();
It's simpler!

Related

The scroll bar moves after data refreshing

I have a JScrollPane with JPanel on it. I have also many different components on JPanel (for example Labels, JTextFields, JTextAreas). These components are added programmatically (at runtime, on the user request).
JPanel uses SpringLayout. The program calculates preferred size of JPanel after adding components, because scrolling doesn't function properly without calculating. Adding components and calculating preferred size are part of my prepareGui() method.
The data displayed on components are periodically refreshed (in my refreshData() method, which is invoked by listener).
My problem: after refreshing, scroll bar always sets to fixed position (I don't know why). I want the scroll bar to stay in old position after refreshing.
I tried to find a place, where the scroll bar moves. I checked some values at the start and at the end of refreshData() method, but they was the same (they didn't change inside of refreshData()):
scrollPane.getVisibleRect().getX()
scrollPane.getVisibleRect().getY()
scrollPane.getVisibleRect().getWidth()
scrollPane.getVisibleRect().getHeight()
panel.getVisibleRect().getX()
panel.getVisibleRect().getY()
panel.getVisibleRect().getWidth()
panel.getVisibleRect().getHeight()
scrollPane.getHorizontalScrollBar().getX()
scrollPane.getHorizontalScrollBar().getY()
scrollPane.getHorizontalScrollBar().getWidth()
scrollPane.getHorizontalScrollBar().getHeight()
scrollPane.getHorizontalScrollBar().getValue()
scrollPane.getVerticalScrollBar().getX()
scrollPane.getVerticalScrollBar().getY()
scrollPane.getVerticalScrollBar().getWidth()
scrollPane.getVerticalScrollBar().getHeight()
scrollPane.getVerticalScrollBar().getValue()
Changing of layout manager didn't take effect.
I noticed one thing (I don't know if it has any meaning). When I set only preferred size (in prepareGui()), the scrollbar moves to the end. When I set also size, the scrollbar moves to strange, fixed position.
How can I prevent this?
The scroll bar should keep it's current position.
I finally found the answer here: https://stackoverflow.com/a/5230477/5694159 (thanks to Johan M) in the topic about JTextArea instead of JPanel.
When the refreshData() is calling in separate thread it works good.
I hope this question and answer will help someone.

How do I remove the shadow border around a JavaFX ContextMenu?

I've been working on a Button extending class that when left-clicked on displays a stay-open popup menu (ContextMenu object) on a configurable side/corner of the button. The constructor takes an enumerated value like NORTH_LEFT that indicates the side of the button where it gets shown and which edges on both the button and popup are aligned. In other words the 2 should always show in an L shape combo, not a T shape.
So when I want to do something like EAST_BOTTOM where the bottom edges of both button and popup should align, I figured something like this would work:
PopupMenu.show(this, Side.RIGHT, 0, this.getHeight() - PopupMenu.getHeight());
But what I get is a Popup that appears much higher up then it should. That's because the PopupMenu.getHeight() call is returning a larger value then expected. I suspect because it is including the large shadow border in its dimensions. I've noticed that this semi-visible border also extends over my button a bit and prevents mouse clicks from registering on the edge of the button near the menu. So I have multiple reasons to want a border of 0 width.
I assume there is a way to do it via CSS. I've tried setting -fx-background-insets and -fx-padding to 0 but neither seems to make a difference. Any other suggestions?
The solution is to add -fx-effect: null; to your CSS for the ContextMenu. This removes the dropshadow effect that is the modena.css default for ContextMenus. Once I did that I was able to correctly place my menu wherever I needed it to go.
Credit for this working answer goes to José Pereda - we worked it out in the comments above.

Find standard JScrollBar width or height

I'm trying to place a component on the corner of the window. However, my window has a scrollbar and the scrollbar is placed on top of the component.
So I'm trying to change the position of the component so that it is adjacent to the scrollbar rather than have it be under it.
Thus, I need the standard width of a scrollbar (vertical) and the standard height of a scrollbar (horizontal).
I could try getVerticalScrollBar.getWidth() at runtime, but unfortunately I need to place the coordinates before I create the scrollbar themselves.
Also, creating an empty JScrollBar and calling getWidth() is returning 0.
Thanks for your help.
Not sure if it helps you right now after a year ago, but:
int scrollBarSize = ((Integer)UIManager.get("ScrollBar.width")).intValue();
I found it here on this discusion: http://www.coderanch.com/t/341287/GUI/java/Calculating-width-JList-vertical-scrollbar
Don't get the size or set the size but rather let the layout managers do the work for you. Consider
adding the scrollbars by default to the JScrollPane via the setVerticalScrollBarPolicy(...) and setHorizontalScrollBarPolicy(...) method pair so that the layout managers take the scrollbars into consideration when laying everything out from the get go.
Avoid null layouts at all costs as this will take away one of the most powerful tools for creating flexible workable Swing GUI's.
If these recommendations don't help, then consider creating and posting an sscce.
I'm not sure about other OS's, but on windows XP it is 17 pixels.
What I would do is temporarily include this line in your program:
System.out.println(jScrollPane.getVerticalScrollBar().getWidth())
then use the value printed.

Position Dialog in primefaces

Shortly: i want to position a dialog in the middle of the screen and not in the middle of the page.
I have a problem positioning a dialog with primefaces. My Dialog is usualy in the middle of the screen and if the height of my page is not bigger than my screen its ok. But if there is a scroll bar and the height is for example 3 times my screen (e.g. 3072 in a 1280*1024 resolution), the Dialog is displayed at position 1536, which is out of my screen. As the background is frozen, the only way i can do something is by refreshing or leaving the page.
Any idea?
Use attribute position:
position="center"
Other possible values are:
top
bottom
left
right
right,top
right,bottom
left,top
left,bottom
You can use html .
-Create div element.Firstly hide it
When you want to show it,change z-index and display of div element.
-You can use size that you want
My idea :)

How does a scroll pane do scrolling

In windows, Java, etc, the scroll pane scrolls the widgets inside. What I'm wondering is, how exactly does it do its scrolling? Does it change the location of each nested widget, or does it have a content widget that it moves around? Or is it something else? Also, when both scrollbars are present, how does it mask that little square at the bottom right? That square is sometimes used to resize. Is it a separate nested widget?
Thanks
I think it just changes the location of the widget, button, or thing-a-ma-bober.
But my second guess would be it just draws the components "outside" of the scroll pane without being seen and when you scroll it just redraws dynamically.

Categories