[英]adding JScrollBar to a JPanel with GridBagLayout
我的整個目的是使事情看起來像這樣:
IMG 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);
如您所見,它完美地添加了所有內容,但scrollbbar並未連接任何東西。 我為此感到無所適從。 我嘗試通過向其添加skillPanelContent來使用JScrollPane,無論我做什么,它都不會顯示。
任何建議或幫助將不勝感激。 我希望我可以根據需要將其保留為短(代碼)。 如果可以提供其他任何幫助,請讓我。 謝謝。
為什么不在contentPanel周圍添加JScrollPane
:
skillsFrame.getContentPane().add(new JScrollPane(skillsPanelContent), BorderLayout.CENTER);
當然,請刪除滾動條。 您可能還需要通過將horizontalScrollBarPolicy設置為ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER
值來禁用它: setHorizontalScrollBarPolicy(int policy)
為了使標題始終位於頂部,您需要拉出標題並將其放在單獨的組件中或置於邊框中。 然后將剩余的日期放在JPanel中,然后執行JScrollPane myScroller = new JScrollPane(myPanel),然后將horizontalscrollbarpolicy設置為NEVER。
使標題與列保持一致可能有點棘手,但是我建議嘗試擴展Border並引用GridBagLayout來獲取列位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.