JToolbar背景和拖动问题

时间:2013-11-27 23:36:35

标签: java swing background transparent jtoolbar

我是Swing的新手,我目前正在从事某种图形编辑工作。 首先,我开始将工具栏(类OptionsBar)实现为扩展JPanel。一切看起来都很好(下图),但它不能用作工具栏(它并不总是聚焦)。然后我发现实际上存在一个JToolBar元素,所以我将“extends JPanel”替换为“extends JToolBar”。我看看工具栏的规格。好像我应该改变一切。

问题是工具栏是透明的(除了它的面板元素),即使isBackgroundSet()返回true。(图像2)

第二个错误是拖动工具栏,然后将其恢复到初始位置。它缩小了。 (图3)

此外,一些动作(我无法准确描述它们)导致java.lang.IllegalArgumentException:非法组件位置

主窗口是一个JFrame,它具有边框布局并使用桌面窗格。

有任何帮助吗?谢谢!

enter image description here

enter image description here

enter image description here

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);

1 个答案:

答案 0 :(得分:1)

回答你的所有问题:

    默认情况下,
  1. JMenuBar是透明的。您可以按如下方式更改该设置:

    menuBar.setOpaque(true);
    
  2. 您已将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(...)

  3. 我很确定此更改还会修复抛出的OptionsBar