如何使我的JScrollBar工作或动态调整JPanel的大小以适应组件?

时间:2017-06-12 14:51:14

标签: java swing jscrollpane jscrollbar

我已经彻底搜索了我的问题的答案并尝试了多种方法,但这些都不适用于我。

我有一个打开JDialog的按钮,允许用户为三种类型的对象/约束属性和更改颜色。

JDialog由2 JPanels组成,第一个包含所有三种类型对象的另外3 JPanels,第二个包含OK / Cancel按钮。

我的问题在于第三种类型的对象,即所谓的“标签约束”。

第三种类型的对象可以有子对象,当用户创建它们时,它们会动态添加到JPanel中,并包含一个名称和一个用于更改对象颜色的按钮。

这是创建包含文本的JPanel和用于选择对象颜色的按钮的方法,并将其添加到labelColorConstraintPanel这个类的字段中。在另一个负责创建对象的方法中调用此方法。

 /**
 * Add the last created label constraint class name(number) and its color
 * button to the panel labelColorConstraintPanel. The button allows user to
 * choose the label constraint class color.
 **/
protected void createLabelColorConstraintsPanel() {

    // labelColorConstraintPanel
    JPanel classNameButtonPanel = new JPanel(new GridLayout(0, 2));
// classNameButtonPanel.setPreferredSize(new Dimension(15, 20));
    classNameButtonPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));

    classNameButtonPanel.add(new JLabel("Class " + labelClassesCount + ":"));
    jb_labelConstraintClassChooseColor.get(labelClassesCount - 1).addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {

            JButton lblClassColorButtonClicked = (JButton) event.getSource();
            int buttonIndex = (int) lblClassColorButtonClicked.getClientProperty("index");
            chooseLabelClassColor(buttonIndex);
        }
    });
    classNameButtonPanel.add(jb_labelConstraintClassChooseColor.get(labelClassesCount - 1));

    labelColorConstraintPanel.add(classNameButtonPanel);
}

labelColorConstraintPanel附加到JScrollPane,附加到第三种类型对象的另一个JPanel - 标签约束。

我的问题是JScrollBar上的JScrollPane不会出现。 不过我读到,将preferredSizeJPanel的{​​{1}}设置为大于此秒的大小会使垂直条显示(请参阅方法JScrollPane中的注释代码行)。

通过这种方式,我设法制作了酒吧节目,但我还有另外两个问题。 第一个:第一个按钮在chooseConstraintsColors创建巨大按钮的总数上增加了拉伸。

第二个:我添加的按钮越多,它们就会调整大小,并且在某些时候行会“拥挤”。

最后我想这两个问题代表了同样的问题,但是我似乎无法找到解决方案。

有另一种方法可以在不设置JPanel的情况下显示JScrollBar,或者有一种方法可以动态增加preferredSize()的大小,因为我们会向其添加新对象固定大小。

以下是创建JPanel窗口的主要方法:

JDialog
P.S:由于我是StackOverflow的新手,我无法真正上传图片,但这里是对图片的描述:

案例1:/** Opens a JDialog for choosing the Constraints Colors **/ protected void chooseConstraintColors() { jd_colorsChooser = new JDialog((Frame) this.getTopLevelAncestor(), "Choose Constraints Colors", true); jd_colorsChooser.getRootPane().setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); jd_colorsChooser.setLayout(new BorderLayout()); JPanel constraintsPanel = new JPanel(new BorderLayout()); JPanel mlConstraintsPanel = new JPanel(); JPanel clConstraintsPanel = new JPanel(); JPanel lblConstraintsPanel=new JPanel(new GridLayout(0,1)); JScrollPane lblConstraintsPane = new JScrollPane(labelColorConstraintPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); lblConstraintsPane.setPreferredSize(new Dimension(130,130)); TitledBorder lblcBorder = BorderFactory.createTitledBorder( BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), "Label Constraints Color", TitledBorder.LEFT, TitledBorder.TOP); lblConstraintsPane.setBorder(lblcBorder); // must-link constraints panel mlConstraintsPanel.setLayout(new BorderLayout()); TitledBorder mlcBorder = BorderFactory.createTitledBorder( BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), "Must-Link Constraints Color", TitledBorder.LEFT, TitledBorder.TOP); mlConstraintsPanel.setBorder(mlcBorder); jb_mustLinkChooseColor.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { chooseMustLinkColor(); } }); mlConstraintsPanel.add(jb_mustLinkChooseColor, BorderLayout.CENTER); // cannot-link constraints panel clConstraintsPanel.setLayout(new BorderLayout()); TitledBorder clcBorder = BorderFactory.createTitledBorder( BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), "Cannot-Link Constraints Color", TitledBorder.LEFT, TitledBorder.TOP); clConstraintsPanel.setBorder(clcBorder); jb_cannotLinkChooseColor.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { chooseCannotLinkColor(); } }); clConstraintsPanel.add(jb_cannotLinkChooseColor, BorderLayout.CENTER); // label constraints panel labelColorConstraintPanel.setPreferredSize(new Dimension(131,131)); lblConstraintsPanel.add(lblConstraintsPane); constraintsPanel.add(mlConstraintsPanel, BorderLayout.NORTH); constraintsPanel.add(clConstraintsPanel, BorderLayout.CENTER); constraintsPanel.add(lblConstraintsPanel, BorderLayout.SOUTH); // button panel JPanel buttonPanel = new JPanel(); JButton ok = new JButton("OK");// update color changes on ok, update // only fields that have changed ok.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { if (mustLinkColorTemp != null && mustLinkColorTemp != mustLinkColor) { mustLinkColor = mustLinkColorTemp; jb_mustLinkChooseColor.setBackground(mustLinkColor); } if (cannotLinkColorTemp != null && cannotLinkColorTemp != cannotLinkColor) { cannotLinkColor = cannotLinkColorTemp; jb_cannotLinkChooseColor.setBackground(cannotLinkColor); } for (int i = 0; i < labelClassesCount; i++) { if (labelConstraintColorTemp.get(i) != null && labelConstraintColorTemp.get(i) != labelConstraintColor.get(i)) { labelConstraintColor.set(i, labelConstraintColorTemp.get(i)); jb_labelConstraintClassChooseColor.get(i).setBackground(labelConstraintColor.get(i)); } } jd_colorsChooser.dispose(); } }); // exit dialog on cancel JButton cancel = new JButton("Cancel"); cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { jb_mustLinkChooseColor.setBackground(mustLinkColor); jb_cannotLinkChooseColor.setBackground(cannotLinkColor); for (int i = 0; i < labelClassesCount; i++) { jb_labelConstraintClassChooseColor.get(i).setBackground(labelConstraintColor.get(i)); } jd_colorsChooser.dispose(); } }); buttonPanel.add(ok); buttonPanel.add(cancel); jd_colorsChooser.add(constraintsPanel, BorderLayout.NORTH); jd_colorsChooser.add(buttonPanel, BorderLayout.SOUTH); jd_colorsChooser.setPreferredSize(new Dimension(270, 270)); jd_colorsChooser.pack(); jd_colorsChooser.setLocationRelativeTo(null); jd_colorsChooser.setVisible(true); } 有3个面板,有一个确定和取消按钮。

如果未使用JDialog,则会在第三个setPreferredSize中逐个添加按钮而不显示滚动条。

案例2:使用了JPanel,出现了一个滚动条,第一个按钮伸展到setPrefferedSize()的大小,因为我们添加了更多按钮,行JPanel的按钮变得拥挤

1 个答案:

答案 0 :(得分:0)

  

通过这种方式,我设法制作了酒吧节目,但我还有另外两个问题。第一个:第一个按钮在JPanel的总数上添加了拉伸,创建了巨大的按钮。第二个:我添加的按钮越多,它们就会被调整大小,并且在某些时候行会变得“拥挤”

  1. 不要使用setPreferredSize()。布局管理器的工作是计算首选大小。

  2. 您使用的是错误的布局管理器。您永远不会被迫使用单个布局管理器来嵌套布局管理器。例如,您可以创建一个带有BorderLayout的JPanel,并将此面板添加到scrollPane。然后使用GridLayout创建第二个面板,使用BorderLayout创建面板的BorderLayout.PAGE_START。现在,专家组将尊重添加到其中的组件的大小,并在必要时增长。