我是Swing的新手,我目前正在从事某种图形编辑工作。 首先,我开始将工具栏(类OptionsBar)实现为扩展JPanel。一切看起来都很好(下图),但它不能用作工具栏(它并不总是聚焦)。然后我发现实际上存在一个JToolBar元素,所以我将“extends JPanel”替换为“extends JToolBar”。我看看工具栏的规格。好像我应该改变一切。
问题是工具栏是透明的(除了它的面板元素),即使isBackgroundSet()返回true。(图像2)
第二个错误是拖动工具栏,然后将其恢复到初始位置。它缩小了。 (图3)
此外,一些动作(我无法准确描述它们)导致java.lang.IllegalArgumentException:非法组件位置
主窗口是一个JFrame,它具有边框布局并使用桌面窗格。
有任何帮助吗?谢谢!
public class OptionsBar extends JToolBar {
..some constants and attributes..
public OptionsBar(BrushStroke brushStroke, BrushStroke savedBrushStroke) {
super();
this.setBackground(backgroundColor);
// keep the references to strokes from the main gui
this.brushStroke = brushStroke;
this.savedBrushStroke = savedBrushStroke;
// create buttons for selecting pencil/eraser
JToggleButton brushButton = makeInstrumentButton(brushIcon, "Pencil");
JToggleButton eraserButton = makeInstrumentButton(eraserIcon, "Eraser");
// make a button for adjusting colors
JButton adjustColorButton = makeAdjustButton();
// create label for descriptions
JLabel toolsLabel = makeDescriptionLabel("Tools");
JLabel parametersLabel = makeDescriptionLabel("Parameters");
JLabel colorsLabel = makeDescriptionLabel("Colors");
// create panel for brush size and opacity parameters
ParameterPanel sizePanel = new ParameterPanel("Size", "1", 1,
maxBrushSize, 1);
ParameterPanel opacityPanel = new ParameterPanel("Opacity", "100", 0,
100, 100);
// create a check box for selecting rounded caps
JCheckBox roundedCap = new JCheckBox("Use round strokes");
roundedCap.setSelected(true);
JSeparator separator = new JSeparator(JSeparator.VERTICAL);
separator.setMaximumSize(new Dimension(3, 35));
JSeparator separator1 = new JSeparator(JSeparator.VERTICAL);
separator1.setMaximumSize(new Dimension(3, 35));
// create a box layout
this.setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
this.add(Box.createHorizontalStrut(20));
this.add(toolsLabel);
this.add(Box.createHorizontalStrut(30));
this.add(brushButton);
this.add(Box.createHorizontalStrut(10));
this.add(eraserButton);
this.add(Box.createHorizontalStrut(30));
this.add(separator1);
this.add(Box.createHorizontalStrut(30));
this.add(parametersLabel);
this.add(Box.createHorizontalStrut(20));
this.add(sizePanel);
this.add(Box.createHorizontalStrut(20));
this.add(opacityPanel);
this.add(Box.createHorizontalStrut(25));
this.add(roundedCap);
this.add(Box.createHorizontalStrut(25));
this.add(separator);
this.add(Box.createHorizontalStrut(30));
this.add(colorsLabel);
this.setOpaque(false);
addColorButtons();
this.add(Box.createHorizontalStrut(20));
this.add(adjustColorButton);
this.colorPicker = new ColorPicker();
colorPicker.getSelectionModel().addChangeListener(new ColorChange());
this.colorPopup = new JPopupMenu();
colorPopup.add(colorPicker);
this.setSize(2000, 65);
this.setVisible(true);
}
这是从JFrame构造函数中剪切的 这是JFrame构造函数的片段
desktop = new JDesktopPane();
setContentPane(desktop);
whiteBoards = new HashMap<String, Canvas>();
createFrame("first try", 400, 300);
desktop.add(new OptionsBar(brushStroke,savedBrushStroke),BorderLayout.PAGE_START);
答案 0 :(得分:1)
回答你的所有问题:
JMenuBar
是透明的。您可以按如下方式更改该设置:
menuBar.setOpaque(true);
您已将JMenuBar
添加到JDesktopPane
容器中。 JDesktopPane
默认情况下没有设置布局,以允许定位添加的JInternalFrame
。这就是为什么如果你没有手动设置大小,JMenuBar
不可见的原因。
通常最好让LayoutManager
对齐您的组件。为此,请使用以下行替换上一个代码段:
desktop = new JDesktopPane();
JPanel basePanel = new JPanel(new BorderLayout());
basePanel.add(desktop, BorderLayout.CENTER);
basePanel.add(new OptionsBar(...), BorderLayout.PAGE_START);
getContentPane().add(basePanel);
此代码使用另一个父JPanel
,允许我们将JMenuBar
添加到顶部区域。我们JMenuBar
的对齐和调整未委托给LayoutManager
的{{1}},因此我们可以摆脱JPanel
的构造函数中的getSize(...)
。
我很确定此更改还会修复抛出的OptionsBar
。