我已经彻底搜索了我的问题的答案并尝试了多种方法,但这些都不适用于我。
我有一个打开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
不会出现。
不过我读到,将preferredSize
中JPanel
的{{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
的按钮变得拥挤
答案 0 :(得分:0)
通过这种方式,我设法制作了酒吧节目,但我还有另外两个问题。第一个:第一个按钮在JPanel的总数上添加了拉伸,创建了巨大的按钮。第二个:我添加的按钮越多,它们就会被调整大小,并且在某些时候行会变得“拥挤”
不要使用setPreferredSize()。布局管理器的工作是计算首选大小。
您使用的是错误的布局管理器。您永远不会被迫使用单个布局管理器来嵌套布局管理器。例如,您可以创建一个带有BorderLayout的JPanel,并将此面板添加到scrollPane。然后使用GridLayout创建第二个面板,使用BorderLayout创建面板的BorderLayout.PAGE_START。现在,专家组将尊重添加到其中的组件的大小,并在必要时增长。