我有一个JScrollpane
,其中包含一个较大的JPanel
,JPanel
它包含一个JPanel
个。JPanels
这3个JScrollpane
中的每一个都与JPanel
具有相同的大小。用户无法滚动。他可以点击一个按钮看到下一个或上一个{{1}}(只有一个面板可以看到,他看不到一个面板的一部分而是其他部分......)。
我如何理解现在正在看哪个面板?
答案 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