Java 使用GridBagLayout将JScrollBar添加到JPanel

Java 使用GridBagLayout将JScrollBar添加到JPanel,java,swing,gridbaglayout,jscrollbar,Java,Swing,Gridbaglayout,Jscrollbar,我这样做的全部目的是得到这样的东西: 我希望我的技能列表滚动类似于在excel中冻结电子表格的顶行 这是我最上面一行的代码 //#### Skills frame start #### skillsFrame = new JInternalFrame("Skills", true, true, false, false); skillsFrame.setLayout(new BorderLayout()); skillsFrame.setLocation(Int

我这样做的全部目的是得到这样的东西:

我希望我的技能列表滚动类似于在excel中冻结电子表格的顶行

这是我最上面一行的代码

    //#### Skills frame start ####
    skillsFrame = new JInternalFrame("Skills", true, true, false, false);
    skillsFrame.setLayout(new BorderLayout());
    skillsFrame.setLocation(Integer.parseInt(configFile.getProperty("SKILLS_FRAME_COORDINATE_X")), 
            Integer.parseInt(configFile.getProperty("SKILLS_FRAME_COORDINATE_Y")));
    skillsFrame.setSize(Integer.parseInt(configFile.getProperty("SKILLS_FRAME_SIZE_X")), 
            Integer.parseInt(configFile.getProperty("SKILLS_FRAME_SIZE_Y")));
    skillsPanelHeader = new JPanel();
    skillsPanelContent = new JPanel();
    //skillsPanelScrollPane = new JScrollPane();
    //skillsPanelScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    //skillsPanelScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

    GridBagLayout gridBagLayout = new GridBagLayout();
    gridBagLayout.columnWidths = new int[]{0, 110, 200, 45, 17};
    gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0};
    gridBagLayout.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0};
    gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
    skillsPanelHeader.setLayout(gridBagLayout);
    skillsPanelContent.setLayout(gridBagLayout);

    JLabel lblImage = new JLabel("Icon");
    lblImage.setFont(new Font("Tahoma", Font.BOLD, 14));
    GridBagConstraints gbc_lblImage = new GridBagConstraints();
    gbc_lblImage.insets = new Insets(0, 0, 5, 5);
    gbc_lblImage.gridx = 0;
    gbc_lblImage.gridy = 0;
    skillsPanelHeader.add(lblImage, gbc_lblImage);

    JLabel lblSkills = new JLabel("Skills");
    lblSkills.setFont(new Font("Tahoma", Font.BOLD, 14));
    GridBagConstraints gbc_lblSkills = new GridBagConstraints();
    gbc_lblSkills.gridx = 1;
    gbc_lblSkills.insets = new Insets(0, 0, 5, 5);
    gbc_lblSkills.gridy = 0;
    skillsPanelHeader.add(lblSkills, gbc_lblSkills);

    JLabel lblExp = new JLabel("Exp");
    lblExp.setFont(new Font("Tahoma", Font.BOLD, 14));
    GridBagConstraints gbc_lblExp = new GridBagConstraints();
    gbc_lblExp.insets = new Insets(0, 0, 5, 5);
    gbc_lblExp.gridx = 2;
    gbc_lblExp.gridy = 0;
    skillsPanelHeader.add(lblExp, gbc_lblExp);

    JLabel lblLevel = new JLabel("Level");
    lblLevel.setFont(new Font("Tahoma", Font.BOLD, 14));
    GridBagConstraints gbc_lblLevel = new GridBagConstraints();
    gbc_lblLevel.insets = new Insets(0, 0, 5, 0);
    gbc_lblLevel.gridx = 3;
    gbc_lblLevel.gridy = 0;
    skillsPanelHeader.add(lblLevel, gbc_lblLevel);

    JSeparator separator = new JSeparator();
    GridBagConstraints gbc_separator = new GridBagConstraints();
    gbc_separator.fill = GridBagConstraints.HORIZONTAL;
    gbc_separator.gridwidth = 4;
    gbc_separator.insets = new Insets(0, 0, 5, 0);
    gbc_separator.gridx = 0;
    gbc_separator.gridy = 1;
    skillsPanelHeader.add(separator, gbc_separator);

    skillsFrame.setMinimumSize(new Dimension(425,500));
    skillsFrame.setVisible(false);
    skillsFrame.getContentPane().add(skillsPanelHeader, BorderLayout.NORTH);
    panel.add(skillsFrame);
    //#### Skills frame end ####
下面是解析(commandString-reply of skills from server/DB)的代码

String SkillsList[]=commandString.split(“\\\\”);
//TODO::不要让画越来越暗
对于(int i=0;i
正如您所看到的,它完美地添加了这一切,但是scrollbbar没有连接到任何东西。我对这件事毫无头绪。我尝试使用JScrollPane,向其添加skillsPanelContent,但无论我做了什么,它都不会显示


任何建议或帮助都将不胜感激。我希望我尽可能地保持这个简短(代码)。如果我能提供更多帮助,请告诉我。谢谢。

为什么不在您的内容面板周围添加一个
JScrollPane

skillsFrame.getContentPane().add(new JScrollPane(skillsPanelContent), BorderLayout.CENTER);

当然,删除你的滚动条。您可能还需要禁用horizontalScrollBarPolicy,方法是将其设置为
ScrollPaneConstants。HORIZONTAL\u SCROLLBAR\u NEVER
值:

要使标题始终位于顶部,您需要拉出标题并将其放在单独的组件或边框中。然后将剩余的日期放在JPanel中,执行JScrollPane myScroller=new JScrollPane(myPanel),然后将horizontalscrollbarpolicy设置为NEVER


保持标题与列对齐可能有点棘手,但我建议尝试扩展边框,并参考GridBagLayout以获得列位置。

你是我翅膀下的风。。。我试图单独做,但当我添加skillsPanelScrollPane.add(skillsPanelContent)时;它一片空白,让我发疯。我不知道为什么它没有那样工作,但我很高兴它按照你的方式工作。非常感谢!!!我有一个问题,我正在寻找与您在图片中制作的布局相同的布局,但无法使您的代码正常工作。我的代码是针对我的应用程序高度定制的-它不是SSCCE。你尝试过什么,有什么问题?
skillsFrame.getContentPane().add(new JScrollPane(skillsPanelContent), BorderLayout.CENTER);