像许多现代鼠标和触控板一样,我的笔记本电脑支持垂直和水平滚动.一旦你习惯它,这是一个令人上瘾的功能.我只是希望我的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) 我的场景中有一个ScrollPane,想要添加一系列节点.确切的数量必须是动态的.我一直在使用Label节点测试这个概念,并且可以根据我想要的内容成功添加ScrollPane(目前是VBox)的内容.
我的问题是弄清楚如何允许用户正常滚动完整的节点ScrollPane.内容与滚动条匹配; 也就是说,当我向下滚动时,内容向下移动.我向上滚动,内容向上滚动.因此,如果我有10个标签,其中只有五个当前可见,那么看到其他五个标签的本能行动就是向下滚动.不幸的是,这只是将整个内容向下移动,将空白区域暴露在顶部并隐藏更多标签.
如果有帮助,我可以发布一些示例代码,但我的攻击计划的要点是:
ScrollPane sp = new ScrollPane();
VBox content = new VBox();
sp.setContent(content);
for (int i = 0; i < 10; i++)
{
Label label = new Label("Label " + i);
content.setPrefHeight(content.getPrefHeight() + label.getPrefHeight());
content.getChildren().add(label);
}
Run Code Online (Sandbox Code Playgroud)
因为我使用的是VBox,所以标签被堆叠在一起(在Y轴上),这就是我想要的.随着更多标签的添加,ScrollBar需要反映增加的VBox大小.我已经尝试了一些方法来实现这一点,包括ScrollPane.setVmax()方法,这没关系,但我仍然有滚动方向的问题将内容移动到错误的方向.我也尝试过EventHandler并相应EventFilter地修改值,仍然没有解决滚动问题,没有向正确的方向移动内容.
答案看起来很简单,但即使经过很长时间搞乱代码,它仍然会让我躲避.
编辑:
jewelsea建议使用ListView解决我的问题.但是,我仍然很好奇为什么使用一个ScrollPane没有这么好的票价.另外,我在实现中遇到了奇怪的行为ListView:我使用一个按钮手动Label向视图添加新内容.经常会在添加新视图后冻结视图Label.在更新滚动位置或显示新添加的位置之前,它会锁定几秒钟Label.我不知道这是不是因为大约有20个左右的Label实例被视图管理,或者是否有更多阴险的东西在起作用.
情况:
首先,我是LibGDX的新手.
我正在制作一个游戏,玩家可以在屏幕上看到所有成就,所以我正在使用ScrollPane.
成就以弹出形式显示(见下图).成就列表将在这些红线内.
截图:

问题:
问题是:当我将小部件添加到ScrollPane时,屏幕仅显示黑屏.
奇怪的是:
- 当我拖动 ScrollPane时,一切都正确呈现.
- 但是当我放手时,屏幕再次变黑.
我做了什么:
- 我发现我放入 ScrollPane参数的任何演员(不仅仅是桌子)都会导致黑屏.
- 如果我将它设置为 null,它可以正常工作.
码:
public void show() {
stage = new Stage();
roomScreenUI = new RoomScreenUI();
roomScreenUI.setName("RoomScreenUI");
stage.addActor(roomScreenUI);
roomScreenButton = new RoomScreenButton[5];
for(int i=0; i<roomScreenButton.length; i++){
roomScreenButton[i] = new RoomScreenButton(i+1, roomScreenUI.getScaleFactor());
roomScreenButton[i].setName("RoomScreenButton");
stage.addActor(roomScreenButton[i]);
}
roomScreenAchievementUI = new RoomScreenAchievementUI(roomScreenUI.getScaleFactor());
roomScreenAchievementUI.setName("RoomScreenAchievementUI");
stage.addActor(roomScreenAchievementUI);
//----------------THE PROBLEM LIES HERE----------------//
achievementContainer …Run Code Online (Sandbox Code Playgroud) 所以,基本上,我正在努力实现这个具有间距等的可滚动组件集以及添加更多组件的能力.组件列表是自定义anchorpane组件.
这是我工作的一个例子:

问题是,在滚动窗格内部使用网格窗格,由于某种原因,网格窗格根本不会填充滚动窗格的宽度.因此,如果我调整大小,一切都保持原样,而不是在gridpane列内拉伸.另外,如果我要坚持使用gridpane(在tilepane上看起来效果更好,除非组件彼此浮动,尽管方向是垂直的并且prefcolumns为1),我将如何添加更多行?这样做的想法是以一种不错的,令人愉悦的方式列出github repos.
感谢您的任何见解.另外:那些回购不是我的 - 我没有,一个网站上的人做了(它做得不好,所以不要把我和他比较大声笑).
我在JavaFX 8中使用ScrollPane遇到一些困难,根据需要显示滚动条.我目前正在做的只是创建一个包含x个元素的FlowPane,并将其设置为ScrollPane的内容.
当我垂直于FlowPane的方向收缩时,问题就出现了.当元素开始换行并超出范围时,滚动条不会出现.当我平行收缩时,这不会发生.我有一个小的Java程序来举例说明这个问题.
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
FlowPane flow = new FlowPane();
flow.setStyle("-fx-border-color: red");
addPanes(flow, 16);
ScrollPane scroll = new ScrollPane(flow);
scroll.setStyle("-fx-border-color: green");
scroll.setFitToHeight(true);
scroll.setFitToWidth(true);
Scene scene = new Scene(scroll, 450, 450);
primaryStage.setScene(scene);
primaryStage.show();
}
public void addPanes(FlowPane root, int panes) {
for(int i = 0; i …Run Code Online (Sandbox Code Playgroud) 我有一个包含JPanel的JScrollPane.我用许多按钮填充这个JPanel.
是否有可能获得当前显示的按钮?
我知道我可以访问JPanel的子节点,jpanel.getComponents()但这些都是此窗格中的组件; 我只想要当前在屏幕上的那些.
我想做什么:
我有一个JavaFX ScrollPane,需要确定中的可见区域ScrollPane。我了解ScrollPane.getViewPortBounds(),这使我可以获得可见区域的大小,但无法获得位置。
有什么办法可以做到吗?
在上下文中:
我正在显示一个非常大的图像,一次只需要部分显示。整个ScrollPane图像用于滚动图像,但是要确定我需要加载图像的哪些部分,我需要知道中显示的可见区域ScrollPane。
我正在 Java 上开发聊天应用程序,我想使用 facebook 使用的函数在用户向上滚动时检索聊天记录。我尝试了“on Scroll”操作,每当滚动到达滚动条的顶部或向下时都会触发事件。现在我只想在滚动条到达顶部时触发动作事件,就像在 facbook 聊天框中一样。
我意识到我不可能是第一个希望将 ScrollPane 的内容保留在 ScrollPanes 视口边界内的人,但经过几个小时的搜索,我找不到问题的答案。
我用各种搜索词搜索了 Google、you.com 和 duckduckgo,例如
以及其他措辞的变化,我还没有找到答案。
我创建了基本的可重现代码,可以准确地对我在实际程序中呈现的数据进行建模。其实很简单:
问题:滚动时,ScrollPane 的内容与 ScrollPane 视口的边框重叠,并且我无法弄清楚如何告诉 ScrollPane 将视口的内容保留在其边框内。
如果有另一种方法可以使可滚动内容保留在视口的边界内,我不知道这一点,并且希望为此提供任何指导。
我的假设是,视口的实际边框显然可以根据其宽度和颜色等进行定义,但它恰好是在与视口的实际内容相同的空间内“绘制”的。因此,不应假设边界是任何类型的预期边界,内容将通过该边界进行绑定......如果这是真的,我当然接受这一点,但这并不能帮助我实现该行为我追求的是,这是为了确保内容不会显示在视口边框上。
在这里,你可以看到我在说什么
下面是显示该行为的代码:
import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.Separator;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import java.util.Random;
public class Main extends Application {
@Override public void start(Stage stage) throws Exception …Run Code Online (Sandbox Code Playgroud)