Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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 正确调整空元素的大小_Java_Swing - Fatal编程技术网

Java 正确调整空元素的大小

Java 正确调整空元素的大小,java,swing,Java,Swing,我正在尝试为数据库创建UI。它有三个主要组件:第一个元素应该是所有类别的可滚动列表,第二个元素是该类别所有项目的可滚动列表,第三个元素是包含实际数据的JPanel(目前只有一个占位符,我可能需要为此生成一个HTML文档) 我对JButtons进行了Category和Item class扩展,因为这是它们唯一的用途 JScrollPane catSelect = new JScrollPane(); catSelect.setHorizontalScrollBarPolicy(JS

我正在尝试为数据库创建UI。它有三个主要组件:第一个元素应该是所有类别的可滚动列表,第二个元素是该类别所有项目的可滚动列表,第三个元素是包含实际数据的
JPanel
(目前只有一个占位符,我可能需要为此生成一个HTML文档)

我对
JButton
s进行了
Category
和Item class扩展,因为这是它们唯一的用途

    JScrollPane catSelect = new JScrollPane();
    catSelect.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    catSelect.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

    JPanel csPanel = new JPanel();
    csPanel.setLayout(new GridLayout());
    csPanel.setPreferredSize(new Dimension(scale.width/1972*300, scale.height));

    JScrollPane recSelect = new JScrollPane();
    JPanel rsPanel = new JPanel();
    rsPanel.setLayout(new GridLayout());
    rsPanel.setPreferredSize(new Dimension(scale.width/1792*300, scale.height));


    JPanel view = new JPanel();
    view.setPreferredSize(new Dimension(scale.width-csPanel.getPreferredSize().width-rsPanel.getPreferredSize().width, scale.height));

    Category dc = null;
    for(int i = 0; i < categories.size(); i++){
        Category cat = categories.get(i);
        cat.setPreferredSize(new Dimension(scale.width/1792*300, scale.height/1120*200));
        csPanel.add(cat);
        cat.addActionListener(rsPanel); //action changes rsPanel content
        if(cat.name.equals("Default")){
            dc = cat; //will always be assigned
        }
    }
    catSelect.add(csPanel);

    for(int i = 0; i < dc.recipes.size(); i++){
        Recipe rec = dc.recipes.get(i);
        rec.setPreferredSize(new Dimension(scale.width/1792*300, scale.height/1120*200));
        rec.addActionlistener(view);
        rsPanel.add(dc.recipes.get(i));
    }
    recSelect.add(rsPanel);

    gbc.gridx = 0;
    gbc.gridy = 0;
    frame.add(catSelect);

    gbc.gridx = 1;
    gbc.gridy = 0;
    frame.add(recSelect);

    gbc.gridx = 2;
    gbc.gridy = 0;
    frame.add(view);
    frame.pack();
JScrollPane catSelect=newjscrollpane();
catSelect.setHorizontalScrollBarPolicy(JScrollPane.HorizontalScrollBar\uNever);
catSelect.setVerticalScrollBarPolicy(JScrollPane.VERTICAL\u SCROLLBAR\u根据需要);
JPanel csPanel=新的JPanel();
setLayout(新的GridLayout());
csPanel.setPreferredSize(新尺寸(比例宽度/1972*300,比例高度));
JScrollPane recSelect=新建JScrollPane();
JPanel rsPanel=新的JPanel();
setLayout(新的GridLayout());
rsPanel.setPreferredSize(新尺寸(比例宽度/1792*300,比例高度));
JPanel视图=新的JPanel();
view.setPreferredSize(新维度(scale.width csPanel.getPreferredSize().width rsPanel.getPreferredSize().width,scale.height));
类别dc=空;
对于(int i=0;i
我试图得到一个从左到右相邻的三个元素,但这里得到的只是一个空的(并且大小不正确)窗口。如果我删除整个块,我会得到一个合适的
JFrame
,它会填满我的屏幕。如果我直接将类别添加到
JFrame
,它们会显示出来,但框架会缩小以包含按钮。如果我添加整个块,我会得到一个空的
JFrame
,大约是我屏幕宽度的2/3,高度的4/5。即使是空组件(即视图组件)也必须以全尺寸显示

我不明白为什么在添加
JScrollPane
时组件突然消失。我做错了什么

JScrollPane catSelect = new JScrollPane();
...
catSelect.add(csPanel);
不要直接将组件添加到JScrollPanel。可以将单个组件添加到滚动窗格的
JViewport

这可以在创建滚动窗格时完成:

JScrollPane catSelect = new JScrollPane( csPanel );
或者,可以使用以下命令动态更新滚动面板的视口:

scrollPane.setViewportView( csPanel );

“我对jbutton进行了Category和Item类扩展,因为这是它们唯一的用途。”使用工厂方法生成它们,不要扩展它们。一般提示:1)为了更快地获得更好的帮助,请添加或。2) 以最小尺寸提供ASCII艺术或GUI预期布局的简单绘图,如果可以调整大小,则提供更大的宽度和高度,以显示如何使用额外的空间。这确实添加了一个可见的JScrollPane,即第二个滚动窗格recSelect。Jbuttons是不可见的,但是当我添加一个JLabel时,它工作了,JLabel扭曲了屏幕的高度。