如何找出JScrollpane中的哪个JPanel?

时间:2013-01-11 09:34:45

标签: java swing jscrollpane

我有一个JScrollpane,其中包含一个较大的JPanelJPanel它包含一个JPanel个。JPanels这3个JScrollpane中的每一个都与JPanel具有相同的大小。用户无法滚动。他可以点击一个按钮看到下一个或上一个{{1}}(只有一个面板可以看到,他看不到一个面板的一部分而是其他部分......)。

我如何理解现在正在看哪个面板?

4 个答案:

答案 0 :(得分:2)

有一个方法isShowing(),用于确定此组件是否在屏幕上显示。这意味着组件必须是可见的,并且必须位于可见和显示的容器中。更多here

示例:

JPanel p= new JPanel();

if(p.isShowing()) {

}

查看this讨论,它会在某种程度上帮助您。您甚至可以使用ComponentListener来收听哪些内容可见。了解更多信息here

答案 1 :(得分:1)

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

scrollPaneObject.getViewPort().getView();

答案 2 :(得分:1)

假设我对您的问题的评论中概述了设置,基本方法是将父级(包含3个面板的组件)visibleRect与其子级边界进行比较。类似的东西:

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);

顺便说一句:要微调滚动行为,您可能会考虑实现Scrollable的自定义面板,例如:

/**
 * 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;
    }

}

答案 3 :(得分:0)

  

用户无法滚动。他可以点击一个按钮,看到下一个或上一个JPanel(只有一个面板可以看到,他看不到一个面板的一部分和其他部分

你应该使用带有CardLayout的JPanel,而不是JScrollPane。

请参阅http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html