我有一个< code>JScrollpane,它包含一个大的< code>JPanel,而< code>JPanel本身包含3个< code>JPanel。这3个< code > JPanel 中的每一个都与< code>JScrollpane具有相同的大小。用户不能滚动。他可以点击一个按钮,看到下一个或上一个< code>JPanel(一次只能看到一个面板,他看不到一个面板的一部分和另一个面板的一部分...).
我如何知道现在看到的是哪个面板?
您可以从 JScrollPane 请求当前显示的组件。
scrollPaneObject.getViewPort().getView();
假设设置如我对您的问题的评论中所述,基本方法是将父级(包含3个面板的组件)的可见Rect与其子边界进行比较。像这样:
final JComponent parent = new JPanel(); // new PageScrollable();
parent.setLayout(new BoxLayout(parent, BoxLayout.PAGE_AXIS));
Color[] color = new Color[] {Color.YELLOW, Color.RED, Color.GREEN};
for (int i = 0; i < color.length; i++) {
JTable table = new JTable(10, 5);
// color it to see some difference
table.setBackground(color[i]);
// set a name for logging
table.setName("table at: " + i);
parent.add(table);
}
JScrollPane scrollPane = new JScrollPane(parent);
Action visible = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
Rectangle rect = parent.getVisibleRect();
for (int i = 0; i < parent.getComponentCount(); i++) {
// implement logic as needed to compare the parent's visible rect
// with the children's bounds
if (rect.intersects(parent.getComponent(i).getBounds())) {
System.out.println("found: " + parent.getComponent(i).getName());
}
}
}
};
frame.add(scrollPane);
frame.add(new JButton(visible), BorderLayout.SOUTH);
题外话:为了微调滚动行为,你可以考虑一个实现可滚动的定制面板,类似于:
/**
* Implement a panel of type Scrollable to fine-tune its scrolling behaviour.
* This implements the prefScrollableSize to the prefSize of the first child
* and both block/unit increment to the height of the prefScrollable.
*/
public static class PageScrollable extends JPanel implements Scrollable {
@Override
public Dimension getPreferredScrollableViewportSize() {
if (getComponentCount() > 0) {
return getComponent(0).getPreferredSize();
}
return super.getPreferredSize();
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect,
int orientation, int direction) {
return getPreferredScrollableViewportSize().height;
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect,
int orientation, int direction) {
return getPreferredScrollableViewportSize().height;
}
@Override
public boolean getScrollableTracksViewportWidth() {
return false;
}
@Override
public boolean getScrollableTracksViewportHeight() {
return false;
}
}
有一个方法<code>isShowing()</code>,用于确定此组件是否显示在屏幕上。这意味着组件必须可见,并且必须位于可见和显示的容器中。这里有更多。
例:
JPanel p= new JPanel();
if(p.isShowing()) {
}
看看这个讨论,它将在某种程度上帮助你。您甚至可以使用ComponentListener来监听哪些是可见的。在这里了解更多信息。
我想在我的基本框架中添加一个带有JPanel的JScrollpane 如果我将带有的直接添加到中,就可以了。但是现在,当我将帧的大小减小到500像素以下时,变得更小,如第二张图片所示。 如何使JScrollPane工作?
问题内容: 我有一个JFrame,在这个JFrame中,我有一个绘制的JPanel,此Panel可以是任何大小,因此我将其放在JScrollpane中,以便当面板大于窗口屏幕大小时可以滚动。 不幸的是,它没有按我预期的那样工作: 使JFrame窗口小于JPanel大小不会显示滚动条 现在,JScrollPane的大小似乎已锁定为我添加到其中的JPanel的大小,就像以前一样,它的大小已调整为JFr
我使用子JPanel构造JScrollPane,然后尝试将JScrollPane添加到父JPanel中,希望有一个可滚动的自定义JPanel。 我有一个大的细白线前面的所有我的组件,他们是没有滚动。有什么想法吗?
我有一个JFrame(黑色)包含一个主JPanel(灰色),这个JPanel包含另外三个JPanels:North和South(红色)以及Center(蓝色)。中央的蓝色JPanel将在程序过程中动态添加大量的JPanel(绿色)。当中心JPanel已满时,我希望一个JScrollbar自动出现,向下滚动中心面板,并看到它包含的所有子(绿色)面板。谁能帮帮我吗?问题是滚动条根本没有出现,如果我在蓝
问题内容: 我尝试使用删除Linux中的文件,但出现错误: 我如何找出哪个进程正在使用此文件? 问题答案: 您可以使用以下命令: 您将收到使用该文件的进程列表。 您可以对其使用不同的标志,以接收更详细的输出。 您可以在热熔器的Wikipedia文章或页面中找到更多信息。
所以,我正在制作一种文本编辑器,我需要一个用于垂直导航的JScrollPane。但我不能让它工作。 我已经阅读了谷歌搜索结果前十页上的每一篇奇怪的教程,但我无法让它发挥作用。 假设我有JFrame(尺寸1000x800)。我想在其中放置一个JPanel(1000x2000),以便它与JFrame水平对齐。我想在JPanel的右侧粘贴一个简单的滚动条,这样就可以访问它的其余部分。 我减少了大小,我将