Java 可滚动JPanel

Java 可滚动JPanel,java,swing,scroll,jpanel,Java,Swing,Scroll,Jpanel,如何使JPanel可滚动?在将滚动界面添加到包含它的面板时,我实现了滚动界面 tabbedPane.add("Editor", new JScrollPane(storeyEditor = new MNScrollablePanel())); 什么都不管用 代码: public class MNScrollablePanel extends JPanel implements Scrollable { public Dimension getPreferredScrollableVi

如何使JPanel可滚动?在将滚动界面添加到包含它的面板时,我实现了滚动界面

tabbedPane.add("Editor", new JScrollPane(storeyEditor = new MNScrollablePanel()));
什么都不管用

代码:

public class MNScrollablePanel extends JPanel implements Scrollable {

    public Dimension getPreferredScrollableViewportSize() {
        return getPreferredSize();
    }

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
        return 10;
    }

    public boolean getScrollableTracksViewportHeight() {
        return false;
    }

    public boolean getScrollableTracksViewportWidth() {
        return false;
    }

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
        return 10;
    }
}

您必须使用
JScrollPane
。然后调用
setViewportview(组件)


您不必实现可滚动,JPanel是allready可滚动的

正如所有其他帖子中提到的,没有理由自己实现可滚动界面。然而,如果你只是在玩,那么发布的基本代码看起来是合理的。但是,您并没有发布演示程序来演示如何使用此代码。将来,在SSCCE上发布你的问题。如果你不知道什么是SSCCE,那么就上网搜索

一个可能的问题是,当添加到滚动窗格视口的组件的“首选大小”大于滚动窗格的大小时,滚动条会自动出现

因此,如果要在面板上进行自定义绘制,则需要负责设置面板更改时的首选大小。如果使用带有组件的面板和布局管理器,则不必担心这一点。但是,如果您使用的组件带有空布局管理器,那么您也会遇到问题


这就是为什么我们需要一个SSCCE,因为我们不知道您如何使用该面板的上下文。

我有一个新的解决方案给您

我认为您必须使用以下代码:

storyEditor = new JPanel();
storyEditor.setPreferredSize(new Dimension(..., ...)); // Insert Here your size for the editor
JScrollPane scroller = new JScrollPane(storyEditor);
tabbedPane.add("Editor", scroller));
frame.setSize(frame.getWidth()+1, frame.getHeight()); // frame is the JFrame where the tabbed pane is into
// Maybe you can replace "frame" with "this"
// You need to resize your frame. Why, I don't know...
frame.pack();
// Your original size will be restored by calling pack

这对我来说是个解决办法。我希望你能来

我就是这样工作的

JPanel test = new JPanel();
test.setPreferredSize(new Dimension( 2000,2000));
JScrollPane scrollFrame = new JScrollPane(test);
test.setAutoscrolls(true);
scrollFrame.setPreferredSize(new Dimension( 800,300));
this.add(scrollFrame);

JPanel不实现可滚动。最好使用JXPanel from,它实现了可滚动并具有更多的功能。

您可以向JScrollPane添加任何组件,不管它是否实现了可滚动,但实现可滚动将为您提供更多的控制。JPanel不实现Scrollable,因此如果您想在显示面板时更好地控制滚动窗格的行为,就必须对其进行子类化。(或者您可以在
JScrollPane
/
JScrollBar
s上设置属性,而不实现任何内容。)@Dan:是的,但我从来没有说过“实现”@MartijnCourteaux您从来没有说过,但这太误导人了。@MartijnCourteaux说
JPanel是allready scrollable
,这意味着它实现了可滚动的界面,但事实并非如此。请注意,您无法控制滚动增量,即,每次单击滚动按钮或每次转动鼠标滚轮都会滚动一个像素,您需要通过实现
Scrollable
来克服这个问题。