我有一个BorderPane带ScrollPane为中心元素.它会自动调整大小以填充屏幕.里面ScrollPane是一个HBox没有内容但是是一个拖放目标.因此,我希望它填补其父母ScrollPane.
这样做的首选方法是什么?
到目前为止我所尝试的是重写ScrollPane.resize(...)调整大小的方法,HBox但它似乎相当复杂和非正统.
编辑:要为此添加一些有用的代码,这就是我可以解决问题的方法,但我相信必须有更好的方法来做到这一点:
@Override
public void resize(double width, double height) {
super.resize(width, height);
double scrollBarHeight = 2;
double scrollBarWidth = 2;
for (final Node node : lookupAll(".scroll-bar")) {
if (node instanceof ScrollBar) {
ScrollBar sb = (ScrollBar) node;
if (sb.getOrientation() == Orientation.HORIZONTAL) {
System.out.println("horizontal scrollbar visible = " + sb.isVisible());
System.out.println("width = " + sb.getWidth());
System.out.println("height = " + sb.getHeight());
if(sb.isVisible()){
scrollBarHeight = sb.getHeight();
} …Run Code Online (Sandbox Code Playgroud) 我需要为我的所有scrollpanes设计这个滚动条:

使用Java Swing.我正在使用Netbeans IDE.什么是最简单的解决方案?
非常感谢你.
问候
我在ScrollPane的默认背景和边框方面遇到了一些问题.使用这种风格使问题更加清晰.
setStyle("-fx-background-color:blue; -fx-border-color:crimson;");
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这种风格并且没有运气,只有红色的边框消失了,并留下了我的蓝色边框.
setStyle("-fx-background-color:blue; -fx-background-insets:0; -fx-border-color:crimson; -fx-border-width:0; -fx-border-insets:0;");
Run Code Online (Sandbox Code Playgroud)

我看过这个旧帖子JavaFX Hide ScrollPane灰色边框和http://docs.oracle.com/javafx/2/ui_controls/editor.htm
这行代码既不起作用也不起作用
scrollPane.getStyleClass().add("noborder-scroll-pane");
Run Code Online (Sandbox Code Playgroud)
谢谢
我有一个需要在ScrollPane中放大的应用程序,但是按照我目前的方法,我仍然面临着两个挑战.为了复制问题,我编写了一个小应用程序ZoomApp,您将找到下面的代码.它的有限功能允许在某些任意形状上放大和缩小(使用Ctrl +鼠标滚轮).当缩放的内容超出窗口范围时,滚动条应该显示.
挑战1. 当内部组缩小尺寸时出现滚动条时,ScrollEvent不再到达我的ZoomHandler.相反,我们开始向下滚动窗口,直到它到达底部,当再次缩放按预期工作时.我想也许吧
scrollPane.setPannable(false);
Run Code Online (Sandbox Code Playgroud)
会有所作为,但没有.如何避免这种不良行为?
挑战2. 我将如何去到中心innerGroup滚动窗格内,不诉诸画一个像素的左上角innerGroup与所需三角洲平方?
作为旁注,根据JavaDoc for ScrollPane:"如果应用程序希望滚动基于节点的可视边界(对于缩放内容等),则需要将滚动节点包装在一个组中".这就是为什么我在ScrollPane中有一个innerGroup 和一个outerGroup的原因.
这个JavaFX新手非常赞赏任何指导我解决方案的建议.
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.control.ScrollPane;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
/**
* Demo of a challenge I have with zooming inside a {@code ScrollPane}.
* <br>
* I am running JavaFx 2.2 on a Mac. {@code java -version} yields:
* <pre> …Run Code Online (Sandbox Code Playgroud) 我想使用ScrollPane在其视口中显示图像,并在图像上还有一个网格(或框,或任何其他类型的注册/位置标记)覆盖.滚动时我需要叠加层保持固定(意味着图像似乎在叠加层下"移动").我将以固定速率在视口中滚动视图以提供平滑运动,并且叠加将提供对视口内某个位置的引用.从概念上讲,考虑在视口中滚动的大型地图,以及具有不移动的矩形的视口(相对于视口本身),该矩形标记可以基于某些用户动作放大的区域.
我假设(但尚未确认)ScrollPane实现有效地处理View的渲染(来自后备存储,不必为每个新的部分曝光重新绘制整个View(甚至ViewPort)),因此不希望覆盖paint()方法.
我看过LayerPane,虽然没有掌握它,但似乎这是一种蛮力的方法.ScrollPane是SplitPane的一个组件,将被移动/调整大小.我希望我必须使用绝对定位手动维护ViewPort和LayerPane之间的正确关系.我远不是GUI设计和实现方面的专家,而且我确信我缺少从有经验的人会知道的明显到模糊和优雅的可能性.
我愿意接受任何建议,而不仅仅是我开始的道路.我是否(我可以)在我的SplitPane中添加JPanel作为一个组件,然后在LayerPane的不同图层上添加一个LayerPane到包含我的ScrollPane和覆盖(另一个JPanel)的那个?ScrollPane中是否有功能直接支持此功能?我查看了Java Swing教程和API文档,但还没有看到任何内容.
谢谢.
更新:
感谢您的链接,trashgod.这比我预期的要容易得多.不需要LayerPane,GlassPane,基于xor的合成......我不知道为什么我没有尝试重写JViewport.paint()来绘制我的叠加层 - 但是使用下面的代码我验证了概念将给我我正在寻找的东西.只需使用JViewport的子类,它就可以完成我想要的操作(在这种情况下,当图像在下面滚动时,在Viewport的中心覆盖一个矩形).我不是GUI专家,Java API非常广泛; 我不知道你们怎么把这一切都放在脑海里 - 但是谢谢!
class MyViewport extends JViewport {
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(Color.BLACK);
g2.drawRect(getWidth()/4,getHeight()/4,getWidth()/2,getHeight()/2);
}
}
Run Code Online (Sandbox Code Playgroud) 这是一段代码片段.
itemList = new List(skin, "ariel.32.white");
String[] tmpInv = new String[b+1];
tmpInv[0] = "<Empty>";
a++;
for (Entry<String, String> entry : inventoryItems.entrySet()) {
tmpInv[a] = entry.getKey();
a++;
//String key = entry.getKey();
//Object value = entry.getValue();
// ...
}
Arrays.sort(tmpInv);
itemList.setItems(tmpInv);
inventoryPane = new ScrollPane(itemList, skin);
Run Code Online (Sandbox Code Playgroud)
这是我得到的,它工作正常.我想在每个项目前面添加描述性图标,但我似乎无法让它工作.我还需要一些方法来获取添加后所选内容的名称.目前我用
itemlist.getSelectedIndex();
Run Code Online (Sandbox Code Playgroud)

JavaFX中的ScrollBar类包含一个用于设置单位增量的属性,这就是我所追求的 - 但是我无法找到如何获取此ScrollBar,或者从ScrollPane类中设置其他方式的单位增量!我认为我必须遗漏一些明显的东西 - 我该如何实现这一目标?
我需要相对于鼠标位置放大/缩小滚动窗格.
我目前通过将我的内容包装在一个组中,并缩放组本身来实现缩放功能.我使用自定义数据透视创建一个新的Scale对象.(枢轴设置为鼠标位置)
这适用于组的初始比例为1.0的情况,但之后的缩放不会在正确的方向上缩放 - 我相信这是因为当缩放组时相对鼠标位置会发生变化.
我的代码:
@Override
public void initialize(URL location, ResourceBundle resources) {
Delta initial_mouse_pos = new Delta();
anchorpane.setOnScrollStarted(event -> {
initial_mouse_pos.x = event.getX();
initial_mouse_pos.y = event.getY();
});
anchorpane.setOnScroll(event -> {
double zoom_fac = 1.05;
double delta_y = event.getDeltaY();
if(delta_y < 0) {
zoom_fac = 2.0 - zoom_fac;
}
Scale newScale = new Scale();
newScale.setPivotX(initial_mouse_pos.x);
newScale.setPivotY(initial_mouse_pos.y);
newScale.setX( content_group.getScaleX() * zoom_fac );
newScale.setY( content_group.getScaleY() * zoom_fac );
content_group.getTransforms().add(newScale);
event.consume();
});
}
private class Delta { double x, y; }
Run Code Online (Sandbox Code Playgroud)
如何在不同的缩放级别获得正确的鼠标位置?是否有一种完全不同的方式来缩放ScrollPane更容易?
像许多现代鼠标和触控板一样,我的笔记本电脑支持垂直和水平滚动.一旦你习惯它,这是一个令人上瘾的功能.我只是希望我的Java应用程序通过触控板/鼠标滚轮支持水平滚动,但在我搜索它的任何地方似乎都不可能在Java中.
我真的希望有人告诉我,我在某种程度上做错了,这个功能已被请求行为:http://bugs.sun.com/bugdatabase/view_bug.do?video_id = 6440198
无法做这个简单的事情实际上是我正在努力的应用程序的交易破坏者.事实上,对于我能想象的任何应用程序!我在Java后端投入了一些时间,所以我真的很想找到一个看似简单的解决方案.
问题是我可以做些什么来实现这种行为?原始操作系统级别的事件是否被java暴露给我,那么我是否需要从头开始编写这个?
import java.awt.*;
public class ScrollExample extends Canvas {
public void paint(Graphics g) {
g.setColor(Color.green);
g.fillOval(0,0,400, 400);
}
public static void main(String[] args) {
ScrollExample b = new ScrollExample();
Frame f = new Frame ("Scroll Example");
ScrollPane scroller = new ScrollPane (ScrollPane.SCROLLBARS_ALWAYS);
scroller.add(b,"Center");
f.setPreferredSize(new Dimension(500,500));
f.add ("Center",scroller);
f.pack();
f.show();
}
}
Run Code Online (Sandbox Code Playgroud)
Swing示例适用于水平和垂直滚动
import java.awt.*;
import javax.swing.*;
public class ScrollExample extends JPanel {
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.green);
g.fillOval(0,0,400, 400);
} …Run Code Online (Sandbox Code Playgroud) 我必须用显示当前时间的线创建时间轴.我正在使用AnchorPane添加放置在ScrollPane中的行.我需要模拟1天,滚动窗格宽度为(2880px,每60px为1小时).我的限制是(前一天12小时,第二天12小时).移动我的线路工作正常.
我需要做的就是在视口中间设置一行并在其下移动内容.对于移动线我使用这种方法:
scrollPane.setHvalue( line.getStartX() - anchorPane.width);
Run Code Online (Sandbox Code Playgroud)
它工作"很好".内容正在移动,但线路正在向前发展.我在线路为0:00(位置设置为0.25)时开始,当位置为(0.75)24 h时结束.我也正在缩放我的时间轴Y轴
/* where line position is calculate by scale, scale is x2, x3, x4.... */
scrollPane.setHvalue( line.getStartX() - anchorPane.width * scale);
Run Code Online (Sandbox Code Playgroud)
请看imgs几小时:0:00,12:00,24:00 ...正确的行位置仅在12:00 ...如何修改功能来设置行的位置?
