Добавление JScrollBar в JPanel с помощью GridBagLayout

Моя цель - сделать что-то похожее на это:

http://img221.imageshack.us/img221/1294/jscrollbaruselessf.png

Я хочу, чтобы мой список навыков прокручивался так же, как в верхнем ряду таблицы в 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 - ответ навыков с сервера / БД)

String SkillsList[] = commandString.split("\\|");
//TODO:: make the painting not keep getting darker and darker
for (int i = 0; i < SkillsList.length; i = i+3){
    JLabel label = new JLabel("");
    label.setIcon(new ImageIcon(SkillsList[i]));
    GridBagConstraints gbc_label = new GridBagConstraints();
    gbc_label.insets = new Insets(0, 0, 5, 5);
    gbc_label.gridx = 0;
    gbc_label.gridy = i+2;
    skillsPanelContent.add(label, gbc_label);

    JLabel lblNewLabel = new JLabel(SkillsList[i+1]);
    GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
    gbc_lblNewLabel.insets = new Insets(0, 0, 5, 5);
    gbc_lblNewLabel.gridx = 1;
    gbc_lblNewLabel.gridy = i+2;
    skillsPanelContent.add(lblNewLabel, gbc_lblNewLabel);

    JProgressBar progressBar_1 = new JProgressBar();
    progressBar_1.setStringPainted(true);
    progressBar_1.setString(SkillsList[i+2] + "/");
    GridBagConstraints gbc_progressBar_1 = new GridBagConstraints();
    gbc_progressBar_1.fill = GridBagConstraints.HORIZONTAL;
    gbc_progressBar_1.insets = new Insets(0, 0, 5, 5);
    gbc_progressBar_1.gridx = 2;
    gbc_progressBar_1.gridy = i+2;
    skillsPanelContent.add(progressBar_1, gbc_progressBar_1);

    JLabel label_1 = new JLabel("1");
    GridBagConstraints gbc_label_1 = new GridBagConstraints();
    gbc_label_1.insets = new Insets(0, 0, 5, 0);
    gbc_label_1.gridx = 3;
    gbc_label_1.gridy = i+2;
    skillsPanelContent.add(label_1, gbc_label_1);

    if (i == SkillsList.length-3){
            JScrollBar scrollbar = new JScrollBar();
            GridBagConstraints gbc_scrollbar = new GridBagConstraints();
            gbc_scrollbar.insets = new Insets(0, 0, 5, 0);
            gbc_scrollbar.gridx = 4;
            gbc_scrollbar.gridy = 2;
            gbc_scrollbar.fill = GridBagConstraints.BOTH;
            gbc_scrollbar.gridheight = i;
            skillsPanelContent.add(scrollbar, gbc_scrollbar);
     }
}
skillsFrame.getContentPane().add(skillsPanelContent, BorderLayout.CENTER);
System.out.println(commandString);

Как вы можете видеть, он добавляет все это идеально, но полоса прокрутки ни к чему не подключена. Я покончил с этим. Я попытался использовать JScrollPane, добавив в него skillPanelContent, и он не отобразился, что бы я ни делал.

Любой совет или помощь будет очень цениться. Я надеюсь, что я сохранил это так коротко (код), как необходимо. Пожалуйста, позвольте мне, если я могу добавить что-нибудь еще, чтобы помочь. Благодарю.

2 ответа

Решение

Почему бы не добавить JScrollPane вокруг вашей контент-панели:

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

И, конечно, удалите полосу прокрутки. Вам также может понадобиться отключить horizontalScrollBarPolicy, установив для него значение ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER значение: setHorizontalScrollBarPolicy(int policy)

Чтобы заголовок всегда оставался сверху, вам нужно вытащить заголовки и поместить их либо в отдельный компонент, либо в рамку. Затем поместите оставшуюся дату в JPanel и выполните JScrollPane myScroller = new JScrollPane(myPanel), а затем установите для horizontalscrollbarpolicy значение НИКОГДА.

Может быть немного сложно удерживать заголовки встроенными в столбцы, но я советую попытаться сделать расширение Border и ссылаться на GridBagLayout для позиций столбцов.

Другие вопросы по тегам