- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如何使 ScrolledComposite 滚动以在顶部显示其中的指定控件?
这是我之前关于 how to make a ScrolledComposite programmatically scroll to a child control 的问题的后续内容。那里给出的建议给了我一些关于如何从概念上尝试它的想法,例如使用 setOrigin 方法,但我无法成功地使给定的示例和我自己的示例完全正常运行。这是我到目前为止构建的内容:
我制作了一个如下所示的外壳: 我有一堆从 1 到 500 的标签,并且有一堆特定按钮,我想让 ScrolledComposite 以其各自的标签为中心,如下所示:
这是代码:
import java.util.HashMap;
public class ScrollableTest2 extends Shell {
private static final int NUM_OF_LABELS = 500;
private static final int[] SEEKABLES = new int[] {0, 9, 23, 99, 175, 176, 177, 178, 350, 495, 499};
Map<Integer, Control> controlMap = new HashMap<Integer, Control>();
private Composite cmpButtons;
private Label vr;
private ScrolledComposite scroller;
private Composite cmpScrollInner;
/**
* Launch the application.
* @param args
*/
public static void main(String args[]) {
try {
Display display = Display.getDefault();
ScrollableTest2 shell = new ScrollableTest2(display);
shell.layout();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Create the shell.
* @param display
*/
public ScrollableTest2(Display display) {
super(display, SWT.SHELL_TRIM);
createContents();
}
/**
* Create contents of the shell.
*/
protected void createContents() {
setSize(400, 400);
setText("SWT Application");
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 3;
setLayout(gridLayout);
cmpButtons = new Composite(this, SWT.NONE);
cmpButtons.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
cmpButtons.setLayout(new GridLayout(1, false));
for (int seekable : SEEKABLES) {
Button button = new Button(cmpButtons, SWT.NONE);
button.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
button.setText("Go To " + String.valueOf(seekable+1));
final int index = seekable;
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
seekToLabel(index);
}
});
}
vr = new Label(this, SWT.SEPARATOR | SWT.VERTICAL);
vr.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true, 1, 1));
scroller = new ScrolledComposite(this, SWT.BORDER | SWT.V_SCROLL);
scroller.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
scroller.setExpandHorizontal(true);
scroller.setExpandVertical(true);
cmpScrollInner = new Composite(scroller, SWT.NONE);
cmpScrollInner.setLayout(new GridLayout(1, false));
scroller.setContent(cmpScrollInner);
for (int i = 0; i < NUM_OF_LABELS; i++) {
Label label = new Label(cmpScrollInner, SWT.NONE);
label.setText("Label " + String.valueOf(i+1));
}
scroller.setMinSize(cmpScrollInner.computeSize(SWT.DEFAULT, SWT.DEFAULT));
scroller.setContent(cmpScrollInner);
scroller.addControlListener(new ControlAdapter() {
public void controlResized(ControlEvent e) {
Rectangle r = scroller.getClientArea();
scroller.setMinSize(cmpScrollInner.computeSize(r.width,
SWT.DEFAULT));
}
});
}
@Override
protected void checkSubclass() {
// Disable the check that prevents subclassing of SWT components
}
protected void seekToLabel(int index) {
Control showCntrl = controlMap.get(new Integer(index));
if(showCntrl != null){
scroller.setOrigin(showCntrl.getLocation());
}
}
}
尽管我相信我正确设置了监听器,但这些按钮似乎根本没有执行任何操作。那么,我必须假设我滥用了 setOrigin 命令。我错过了什么?
最佳答案
哎呀别介意!事实证明,我只是忘记将控件添加到控件图中。一旦我这样做了,它就完美地工作了。
for (int i = 0; i < NUM_OF_LABELS; i++) {
Label label = new Label(cmpScrollInner, SWT.NONE);
label.setText("Label " + String.valueOf(i+1));
controlMap.put(new Integer(i), label);
}
这毕竟是一个愚蠢的错误。
关于java - 使用 ScrolledComposite 的 setOrigin 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21295967/
鼠标滚轮在 macOS 上工作正常,但在 Windows 上无法工作。 这是我的布局结构,我实现了鼠标滚轮监听器,但它没有触发。 scrolledComposite.addListener(S
我正在尝试创建一个容器,其中将在一定数量的按钮之后包含一个按钮我想获得一个滚动条,但目前滚动条没有出现任何建议? 编辑 MoBuConLTLUI 类 public class MoBuConLTLUI
我有一个从 ScrolledComposite 扩展的类,在这个类中我创建了一个 Composite,它旨在填充父 ScrolledComposite。但是每当我将标签添加到内部复合 Material
我的问题是,如果我的 Scrolled Composite 有 scrolledWrapper.setExpandHorizontal(true); scrolledWrapper.setExpand
当我尝试将大量标签添加到包含在 ScrolledComposite 中的某个数字(1638)之后的 Composite 上时,它似乎放弃并停止绘制其后的组件。这是对可以显示的许多内容的硬性限制还是我做
我当前正在尝试扩展 JFace 对话框以包含 scrolledComposite。我的代码目前如下所示: import org.eclipse.jface.dialogs.Dialog; import
我正在创建一个图例 View ,外壳内部应该有一个矩形,后面跟着一个描述颜色的标签。我能够仅使用普通的合成图像来使 View 正常工作,但图例继续超出屏幕范围,如果不增大窗口就无法看到它。我尝试在 s
我在将 ScrolledComposite 放入 Group 内时遇到问题 - 它没有显示在 Group 内。 ScrolledComposite 必须滚动 Label。 final private
我正在努力获取选项卡文件夹中的可滚动区域......不知道我哪里出错了...如果我在这方面得到一些帮助,那就太好了...... public void createCustomControl(
我有一个显示 ScrolledComposite 的应用程序。用户提示水平滚动增量太细,即每次单击水平滚动箭头当前一次移动一个像素。他们希望通过单独的点击来产生更大的水平移动。有人可以解释我如何实现这
我在 ScrolledComposite 中有一个 StyledText 小部件 (SWT),它应该显示日志文件的内容。不幸的是,日志文件中有数千行,因此我发现小部件在大约 2200 行后切断了文本。
我想要一个包含多个组合的 ScrolledComposite 。 如果调整窗口大小,则 ScrolledComposite 无法正确调整大小。如果我缩小宽度,它将切断内容的底部,并且不允许用户向下滚动
我正在制作一个应用程序,其中包含从数据库 stub (它将成为 Oracle 数据库)返回的多行数据,并且由于某种原因滚动条停在大约第 500 个元素处。我想知道是否有任何元素都显示在滚动条中。
我很难找到滚动条在 TabFolder 中按预期工作的示例。下面是示例代码。谁能告诉我我做错了什么,或者它是否是一个错误? import org.eclipse.swt.SWT; import org
我正在尝试创建一个图例,我想要的方式是有两个单独的复合 Material ,一个位于滚动复合 Material 内部的另一个之上。顶部复合子项是标签和 Canvas 的另一个复合体。该组合是从属性文件
以下代码片段在 ScrolledComposite 内生成一个 Composite。我还在里面贴了一个标签。显示垂直滚动条,表明复合 Material 占用了太多空间。 @Override publi
我正在为 eclipse 开发一个插件,我正在努力使用 ScrolledComposite 以及让它占用剩余空间。 父布局是一个 2 列网格: @Override public void create
我们有一个带有很多很多子组合的 ScrolledComposite 。无论出于何种原因,它都不会滚动超过大约 30,000 像素。 这里有一个片段来显示问题。至少在这台电脑上,我能够滚动到的最后一个按
如何正确使用ScrolledComposite? 以下内容略有修改Snipped166: import org.eclipse.swt.*; import org.eclipse.swt.custo
我在 SashForm 左侧有一个包含 n 个 Tree 树的对话框。每棵树都位于 ScrolledComposite 中。 我的问题是,滚动复合 Material 内部之间有太多未被树覆盖的空白空间
我是一名优秀的程序员,十分优秀!