[英]GridBagLayout with vertical scrollbar
I try to make a chart using a GridBagLayout
, which I admit is pretty difficult, mainly because it doesn't seem to be the best way for that purpose... 我尝试使用
GridBagLayout
创建一个图表,我承认这很难,主要是因为它似乎不是最好的方法...
Now I try to have a vertical scrollbar so I can basically have as many rows as I want into this GridBagLayout
, but I can't find a way to do it. 现在我尝试使用垂直滚动条,这样我基本上可以在
GridBagLayout
拥有尽可能多的行,但我找不到办法。 I tried the most straightforward (and maybe naive) way, but it doesn't look to work: 我尝试了最直接的(也许是天真的)方式,但它看起来不起作用:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class TestCode2_Scrollbar {
public static void main(String[] args) {
JFrame window = new JFrame("Test");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setSize(400, 200);
window.setMinimumSize(new Dimension(350, 150));
JPanel panelMain = new JPanel(new BorderLayout());
window.add(panelMain);
//Comment the next 2 lines when using without scroll bar
JScrollPane scrollPanel = new JScrollPane();
panelMain.add(scrollPanel, BorderLayout.CENTER);
GridBagLayout innerLayout = new GridBagLayout();
GridBagConstraints innerConstraints = new GridBagConstraints();
JPanel innerPanel = new JPanel(innerLayout);
innerPanel.setBackground(new Color(0, 220, 250));
//Comment one of the 2 following lines:
scrollPanel.add(innerPanel);
//panelMain.add(innerPanel, BorderLayout.CENTER);
innerConstraints.weightx = 0.0;
innerConstraints.weighty = 0.0;
innerConstraints.gridy = 0;
innerConstraints.gridx = 0;
JLabel lblTitle = new JLabel("Title / ");
innerLayout.setConstraints(lblTitle, innerConstraints);
innerPanel.add(lblTitle);
innerConstraints.gridx = 1;
JLabel lblRating = new JLabel("Rating / ");
innerLayout.setConstraints(lblRating, innerConstraints);
innerPanel.add(lblRating);
innerConstraints.gridx = 2;
JLabel lblCategoryCode = new JLabel("Category code / ");
innerLayout.setConstraints(lblCategoryCode, innerConstraints);
innerPanel.add(lblCategoryCode);
innerConstraints.gridx = 3;
innerConstraints.weightx = 1.0;
innerConstraints.fill = GridBagConstraints.HORIZONTAL;
JLabel lblDescription = new JLabel("Description");
innerLayout.setConstraints(lblDescription, innerConstraints);
innerPanel.add(lblDescription);
int max = 4;
for(int i = 0; i < max; i++) {
innerConstraints.weightx = 0.0;
innerConstraints.fill = GridBagConstraints.NONE;
innerConstraints.anchor = GridBagConstraints.NORTHWEST;
innerConstraints.gridy = i + 1;
innerConstraints.gridx = 0;
lblTitle = new JLabel("" + i);
innerLayout.setConstraints(lblTitle, innerConstraints);
innerPanel.add(lblTitle);
innerConstraints.gridx = 1;
lblRating = new JLabel("" + i);
innerLayout.setConstraints(lblRating, innerConstraints);
innerPanel.add(lblRating);
innerConstraints.gridx = 2;
lblCategoryCode = new JLabel("" + i);
innerLayout.setConstraints(lblCategoryCode, innerConstraints);
innerPanel.add(lblCategoryCode);
innerConstraints.gridx = 3;
innerConstraints.weightx = 1.0;
innerConstraints.fill = GridBagConstraints.HORIZONTAL;
lblDescription = new JLabel("" + i);
innerLayout.setConstraints(lblDescription, innerConstraints);
innerPanel.add(lblDescription);
}
innerConstraints.gridy = max + 1;
JPanel innerVoidPanel = new JPanel();
innerVoidPanel.setBackground(new Color(0, 250, 250));
innerConstraints.weighty = 1.0;
innerConstraints.fill = GridBagConstraints.VERTICAL;
innerLayout.setConstraints(innerVoidPanel, innerConstraints);
innerPanel.add(innerVoidPanel);
//...
scrollPanel.add(innerPanel);
window.setVisible(true);
}
}
Remove all the lines where you add the innerPanel to the scrollpane. 删除将innerPanel添加到滚动窗格的所有行。 And instead, add these two lines at the end of the main method:
而是在main方法的末尾添加这两行:
JScrollPane scrollPanel = new JScrollPane(innerPanel);
panelMain.add(scrollPanel, BorderLayout.CENTER);
Complete code: 完整代码:
public class TestCode2_Scrollbar {
public static void main(String[] args) {
JFrame window = new JFrame("Test");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setSize(400, 200);
window.setMinimumSize(new Dimension(350, 150));
JPanel panelMain = new JPanel(new BorderLayout());
window.add(panelMain);
//Comment the next 2 lines when using without scroll bar
GridBagLayout innerLayout = new GridBagLayout();
GridBagConstraints innerConstraints = new GridBagConstraints();
JPanel innerPanel = new JPanel(innerLayout);
innerPanel.setBackground(new Color(0, 220, 250));
//Comment one of the 2 following lines:
//panelMain.add(innerPanel, BorderLayout.CENTER);
innerConstraints.weightx = 0.0;
innerConstraints.weighty = 0.0;
innerConstraints.gridy = 0;
innerConstraints.gridx = 0;
JLabel lblTitle = new JLabel("Title / ");
innerLayout.setConstraints(lblTitle, innerConstraints);
innerPanel.add(lblTitle);
innerConstraints.gridx = 1;
JLabel lblRating = new JLabel("Rating / ");
innerLayout.setConstraints(lblRating, innerConstraints);
innerPanel.add(lblRating);
innerConstraints.gridx = 2;
JLabel lblCategoryCode = new JLabel("Category code / ");
innerLayout.setConstraints(lblCategoryCode, innerConstraints);
innerPanel.add(lblCategoryCode);
innerConstraints.gridx = 3;
innerConstraints.weightx = 1.0;
innerConstraints.fill = GridBagConstraints.HORIZONTAL;
JLabel lblDescription = new JLabel("Description");
innerLayout.setConstraints(lblDescription, innerConstraints);
innerPanel.add(lblDescription);
int max = 4;
for(int i = 0; i < max; i++) {
innerConstraints.weightx = 0.0;
innerConstraints.fill = GridBagConstraints.NONE;
innerConstraints.anchor = GridBagConstraints.NORTHWEST;
innerConstraints.gridy = i + 1;
innerConstraints.gridx = 0;
lblTitle = new JLabel("" + i);
innerLayout.setConstraints(lblTitle, innerConstraints);
innerPanel.add(lblTitle);
innerConstraints.gridx = 1;
lblRating = new JLabel("" + i);
innerLayout.setConstraints(lblRating, innerConstraints);
innerPanel.add(lblRating);
innerConstraints.gridx = 2;
lblCategoryCode = new JLabel("" + i);
innerLayout.setConstraints(lblCategoryCode, innerConstraints);
innerPanel.add(lblCategoryCode);
innerConstraints.gridx = 3;
innerConstraints.weightx = 1.0;
innerConstraints.fill = GridBagConstraints.HORIZONTAL;
lblDescription = new JLabel("" + i);
innerLayout.setConstraints(lblDescription, innerConstraints);
innerPanel.add(lblDescription);
}
innerConstraints.gridy = max + 1;
JPanel innerVoidPanel = new JPanel();
innerVoidPanel.setBackground(new Color(0, 250, 250));
innerConstraints.weighty = 1.0;
innerConstraints.fill = GridBagConstraints.VERTICAL;
innerLayout.setConstraints(innerVoidPanel, innerConstraints);
innerPanel.add(innerVoidPanel);
//...
JScrollPane scrollPanel = new JScrollPane(innerPanel);
panelMain.add(scrollPanel, BorderLayout.CENTER);
window.setVisible(true);
}
}
Code looks good to me. 代码对我来说很好看。 If you want to see the scroller always, try to set the scrollbarpolicy for scrollpane as below.
如果要始终查看滚动条,请尝试为滚动窗格设置滚动条策略,如下所示。
scrollPanel.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPanel.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
This should help 这应该有所帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.