当前位置: 首页 > 知识库问答 >
问题:

如何找出JScrollpane中的哪个JPanel正在被看到?

巫马修为
2023-03-14

我有一个< code>JScrollpane,它包含一个大的< code>JPanel,而< code>JPanel本身包含3个< code>JPanel。这3个< code > JPanel 中的每一个都与< code>JScrollpane具有相同的大小。用户不能滚动。他可以点击一个按钮,看到下一个或上一个< code>JPanel(一次只能看到一个面板,他看不到一个面板的一部分和另一个面板的一部分...).

我如何知道现在看到的是哪个面板?

共有3个答案

冯亮
2023-03-14

您可以从 JScrollPane 请求当前显示的组件。

scrollPaneObject.getViewPort().getView();
充子航
2023-03-14

假设设置如我对您的问题的评论中所述,基本方法是将父级(包含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;
    }

}
袁智明
2023-03-14

有一个方法<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的右侧粘贴一个简单的滚动条,这样就可以访问它的其余部分。 我减少了大小,我将