带有面板的Java Swing JToolbar:外观和感觉

我有一个包含多个JPanelsJToolbar (因为我希望每个JPanels都有特定的边框)。 遗憾的是,Look&Feel管理器无法将JPanels识别为属于工具栏,因此JButtons因此呈现为普通按钮(即没有工具栏上的特殊鼠标hover效果)。

JToolbars替换JPanels不是一个选项,因为LAF渲染器为它提供了特殊的背景。

还有其他选项/提示吗?

如下所示,您可以更改工具栏的布局并根据需要添加组件。 您还可以拥有任意数量的工具栏。 这里展示了L&F组合。 请注意, JToolBaraddSeparator()方法提供了一个特定于L&F的JToolBar.Separator

测试图像

 import component.Laf; import java.awt.EventQueue; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JToolBar; /** * @see https://stackoverflow.com/a/16121288/230513 */ public class JToolBarTest { private void display() { JFrame f = new JFrame("Test"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setLayout(new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS)); // https://stackoverflow.com/a/11949899/230513 f.add(Laf.createToolBar(f)); f.add(createBar()); f.add(createBar()); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } private JToolBar createBar() { JToolBar toolBar = new JToolBar(); toolBar.add(createPanel()); toolBar.addSeparator(); toolBar.add(createPanel()); return toolBar; } private JPanel createPanel() { JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder("Panel")); Action buttonAction = new AbstractAction("Button"){ @Override public void actionPerformed(ActionEvent e) { System.out.println(e.getActionCommand() + " " + e.getSource().hashCode()); } }; panel.add(new JButton(buttonAction)); panel.add(new JButton(buttonAction)); return panel; } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new JToolBarTest().display(); } }); } }