Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 嵌套JScrollPane不适合_Java_Swing_Layout_Jpanel_Jscrollpane - Fatal编程技术网

Java 嵌套JScrollPane不适合

Java 嵌套JScrollPane不适合,java,swing,layout,jpanel,jscrollpane,Java,Swing,Layout,Jpanel,Jscrollpane,我对嵌套的JScrollPanes有问题。基本上,我希望有一个外部JScrollPane可以垂直滚动,但不能水平滚动(想想Netflix web界面)。在这个外部JScrollPane中,我希望有多个水平滚动的JScrollPane。我的问题是,内部JScrollPanes的水平滚动条永远不会出现,因为看起来它们占用了JPanel的整个首选大小。下面是一张图片来描述我所说的内容: 编辑:基于camickr答案的代码现在正在运行: import java.awt.BorderLayout; i

我对嵌套的JScrollPanes有问题。基本上,我希望有一个外部JScrollPane可以垂直滚动,但不能水平滚动(想想Netflix web界面)。在这个外部JScrollPane中,我希望有多个水平滚动的JScrollPane。我的问题是,内部JScrollPanes的水平滚动条永远不会出现,因为看起来它们占用了JPanel的整个首选大小。下面是一张图片来描述我所说的内容:

编辑:基于camickr答案的代码现在正在运行:

import java.awt.BorderLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class NestedScrollPane extends JFrame {

    public NestedScrollPane() {
        ScrollablePanel outerPanel = new ScrollablePanel();
        outerPanel.setScrollableWidth(ScrollablePanel.ScrollableSizeHint.FIT);
        outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.Y_AXIS));
        for (int j = 0; j < 20; j++) {
            ScrollablePanel innerPanel = new ScrollablePanel();
            innerPanel.setScrollableHeight(ScrollablePanel.ScrollableSizeHint.NONE);
            innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS));
            JScrollPane innerScrollPane = new JScrollPane(innerPanel);
            innerScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
            for (int i = 0; i < 10; i++) {
                JLabel longLabel = new JLabel("asefaesfesfesfgesgersgrsgdrsgdrsgderg ");
                innerPanel.add(longLabel);
            }
            outerPanel.add(innerScrollPane);
        }
        JScrollPane outerPane = new JScrollPane(outerPanel);
        outerPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        this.setContentPane(outerPane);
        this.setSize(400, 400);
        outerPane.setSize(400, 400);
        this.setVisible(true);
    }

    public static void main (String[] args) {
        NestedScrollPane pane = new NestedScrollPane();
        pane.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
导入java.awt.BorderLayout;
导入javax.swing.BoxLayout;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
公共类NestedScrollPane扩展了JFrame{
公共嵌套滚动窗格(){
ScrollablePanel outerPanel=新的ScrollablePanel();
outerPanel.setScrollableWidth(ScrollablePanel.ScrollableSizeHint.FIT);
outerPanel.setLayout(新的BoxLayout(outerPanel,BoxLayout.Y_轴));
对于(int j=0;j<20;j++){
ScrollablePanel innerPanel=新的ScrollablePanel();
innerPanel.setScrollableHeight(ScrollablePanel.ScrollableSizeHint.NONE);
setLayout(新的BoxLayout(innerPanel,BoxLayout.X_轴));
JScrollPane innerScrollPane=新的JScrollPane(innerPanel);
innerScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HorizontalScrollBar\uAlways);
对于(int i=0;i<10;i++){
JLabel longLabel=新JLabel(“asefaesfesfgesgersgrsgdrsgdrsgderg”);
添加(长标签);
}
添加(内部滚动窗格);
}
JScrollPane outerPane=新的JScrollPane(outerPanel);
outerPane.setHorizontalScrollBarPolicy(JScrollPane.HorizontalScrollBar\uNever);
这个.setContentPane(outerPane);
这个。设置大小(400400);
外部平面设置尺寸(400400);
此.setVisible(true);
}
公共静态void main(字符串[]args){
NestedScrollPane=新建NestedScrollPane();
pane.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

我看了一下,但在外部面板上使用BoxLayout或BorderLayout似乎并没有解决任何问题

您需要实现添加到视口的外部面板的
可滚动
界面,以强制面板填充视口的宽度

一个简单的方法是使用。您应该能够使用:

// JPanel outerPanel = new JPanel();
ScrollablePanel outerPanel = new ScrollablePanel();
outerPanel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );

只是一个猜测,但这看起来很相关:
JScrollPane.HORIZONTAL\u SCROLLBAR\u从不
我把它放在那里,因为我不希望外部的JScrollPane水平滚动。我希望它是一个固定的宽度,并且内部的滚动窗格能够水平滚动。啊,好的。你想要内在的。我误读了这个问题。我把问题编辑得更清楚一点。对不起,我不确定。我重新排列了代码,并设法合并了水平滚动条,但反过来,我取消了外部垂直滚动条。我可以买一个或另一个,但不能两者都买。问得好。我刚试过这个,它似乎没有改变什么。也许我误解了在哪个面板上使用这种方法。我试着在内部面板上,外部面板上,两个面板上都做了,只是外部。对我来说效果很好,虽然你看到的只是滚动条,因为没有垂直空间来实际绘制标签。嗯,这似乎让水平滚动条显示出来。您知道为什么垂直空间消失了吗?标签的首选高度仅等于文本的高度。如果要查看文本和滚动条,则需要将水平滚动条的权限设置为
始终
,然后首选大小将包括文本和滚动条。