Java 为JToolbar创建复合Swing组件

Java 为JToolbar创建复合Swing组件,java,swing,jtoolbar,Java,Swing,Jtoolbar,使用setRollover(true)时,Swing工具栏上的按钮是平坦的,没有边框,只有在悬停/按下按钮时才会绘制边框。但是,如果先将按钮添加到面板,然后将面板添加到工具栏,则此操作不起作用。有什么简单的方法可以实现吗 我希望按钮位于JPanel中,以使它们作为单个组件(想象一个带有第一页/上一页/下一页/最后一页按钮的分页组件)。我还希望它能够在不考虑L&F的情况下工作(就像JPanel不在工具栏和按钮之间一样) 编辑: 将下面示例中的按钮1和按钮2(直接添加)与按钮3和按钮4(通过JPan

使用setRollover(true)时,Swing工具栏上的按钮是平坦的,没有边框,只有在悬停/按下按钮时才会绘制边框。但是,如果先将按钮添加到面板,然后将面板添加到工具栏,则此操作不起作用。有什么简单的方法可以实现吗

我希望按钮位于JPanel中,以使它们作为单个组件(想象一个带有第一页/上一页/下一页/最后一页按钮的分页组件)。我还希望它能够在不考虑L&F的情况下工作(就像JPanel不在工具栏和按钮之间一样)

编辑:

将下面示例中的按钮1和按钮2(直接添加)与按钮3和按钮4(通过JPanel添加)进行比较:

import javax.swing.*;

public class ToolbarTest extends JFrame {
    ToolbarTest() {
        JToolBar toolbar = new JToolBar();
        toolbar.setRollover(true);

        JButton button = new JButton("One");
        button.setFocusable(false);
        toolbar.add(button);

        button = new JButton("Two");
        button.setFocusable(false);
        toolbar.add(button);

        JPanel panel = new JPanel();
        button = new JButton("Three");
        button.setFocusable(false);
        panel.add(button);

        button = new JButton("Four");
        button.setFocusable(false);
        panel.add(button);

        toolbar.add(panel);

        add(toolbar);
        pack();
    }

    public static void main(String[] args) throws Throwable {
        // optional: set look and feel (some lf might ignore the rollover property)
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {      // or "Windows", "Motif"
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }

        ToolbarTest frame = new ToolbarTest();
        frame.setVisible(true);
    }
}
以下是截图:

Nimbus LF上的工具栏:

当鼠标悬停在第二个按钮上时,使用相同的工具栏(不显示鼠标光标):

Windows LF上的同一工具栏:

我希望三个和四个按钮的工作方式与一个和两个按钮相同。

1)我建议使用而不是
JToolbar

缺点:

  • 不能移动和拆卸,也不能从
    容器中取出

  • 通过使用
    LayoutManager


2) 对于
JToolBar
,最好将一个
JPanel
嵌套另一个
JComponents
,如代码示例所示



3) 在您的代码示例中,您定义了一个
JButton
第四次,在Java中需要使用另一个JToolbar而不是JPanel works定义为单独的
对象

但是:如果我想将复合组件包含到对话框或工具栏以外的其他内容中,那么我可能(或者可能没有)会遇到问题。(这类似于有两种按钮,一种用于工具栏,另一种用于其他)

这是问题中的代码部分,添加面板更改为添加工具栏

JToolBar component = new JToolBar();
component.setRollover(true);
component.setBorder(null);
component.setFloatable(false);

button = new JButton("Three");
button.setFocusable(false);
component.add(button);

button = new JButton("Four");
button.setFocusable(false);
component.add(button);

toolbar.add(component);

我从没见过。请编辑你的问题,我已经添加了一个例子。它必须是JToolBar吗?你需要在屏幕上使用JToolBar吗?如果可能的话,我更喜欢标准的JToolBar,但是如果有其他工具栏实现可以处理这个问题,那么我不反对使用它。(如果你的问题是我是否需要使用工具栏,那么是的-应用程序有菜单、工具栏等。LF确保工具栏在给定平台上充当工具栏,它是可分离的,等等)好问题:-)查看代码发现BasicToolBarUI只处理直接的子级。这方面没什么可做的…广告3):我确实定义了4个独立的JButton对象。只有变量被重用。物体不是。我不确定我是否理解。我想得到嵌入面板的按钮的滚动效果,而不仅仅是直接添加的按钮。但是如果我像你建议的那样使用JMenuBar,那么我就不会得到任何按钮的效果。