繁体   English   中英

Java JScrollPane ve

[英]Java JScrollPane ve

我想制作一个Java代码,可以在其中插入任意数量的面板。 这样我就可以向下滚动以查看面板。 我现在为止很远:但是我的问题是,我无法向下滚动。 我用JTextAreas测试了JScrollPane,它工作得很好。

我的程序图片

package test;

import java.awt.*;
import javax.swing.*;

public class Scrollbar {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        JPanel panel1 = new JPanel();
        JPanel panel2 = new JPanel();
        JPanel panel3 = new JPanel();
        JTextField tFId = new JTextField("ID: ", 5);
        JTextField tFName = new JTextField("Name: ", 5);
        JTextField tFHersteller = new JTextField("Hersteller: ", 5);
        JTextField tFId2 = new JTextField("ID: ", 5);
        JTextField tFName2 = new JTextField("Name: ", 5);
        JTextField tFHersteller2 = new JTextField("Hersteller: ", 5);
        JTextField tFId3 = new JTextField("ID: ", 5);
        JTextField tFName3 = new JTextField("Name: ", 5);
        JTextField tFHersteller3 = new JTextField("Hersteller: ", 5);

        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());

        panel.setLayout(new FlowLayout());
        panel.setPreferredSize(new Dimension(200, 85));
        panel.add(panel1);
        panel.add(panel2);
        panel.add(panel3);
        JScrollPane scrollPanel = new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        panel1.setLayout(new FlowLayout());
        panel1.add(tFId);
        panel1.add(tFName);
        panel1.add(tFHersteller);

        panel2.setLayout(new FlowLayout());
        panel2.add(tFId2);
        panel2.add(tFName2);
        panel2.add(tFHersteller2);

        panel3.setLayout(new FlowLayout());
        panel3.add(tFId3);
        panel3.add(tFName3);
        panel3.add(tFHersteller3);

        frame.add(scrollPanel);
        frame.setVisible(true);
    }
}

您正在过度使用FlowLayout。

不同的布局具有不同的行为。 首先,您需要删除以下行:

frame.setLayout(new FlowLayout());

框架内容窗格的默认布局是BorderLayout。 您希望以这种方式保留它,因为添加到BorderLayout且没有任何约束的组件将放置在中心,该组件将在其中伸展以填充整个空间。

其次,您要删除这些:

panel.setLayout(new FlowLayout());
panel.setPreferredSize(new Dimension(200, 85));

设置首选大小会干扰JScrollPane管理其视图(即panel )的能力。 当您希望组件显示在多行中时,应尝试通过限制FlowLayout的宽度来强制执行它。 而是使用旨在将组件放置在不同行上的布局。 最好的选择是GridBagLayout

panel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
panel.add(panel1, gbc);
panel.add(panel2, gbc);
gbc.weighty = 1;
gbc.anchor = GridBagConstraints.NORTH;
panel.add(panel3, gbc);

在约束中使用GridBagConstraints.REMAINDER将告诉GridBagLayout使子组件占据整个行。

weighty = 1的使用告诉GridBagLayout当面板大于其子项时,要添加的子项的网格单元应占用所有额外的垂直空间。 最后,无论网格单元有多高,GridBagConstraints.NORTH都将其子项放置在拉伸网格单元的顶部。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM