java - Swing 中的统一工具栏无法正常工作

标签 java macos swing user-interface

我遵循了本教程:http://explodingpixels.wordpress.com/2008/05/02/sexy-swing-app-the-unified-toolbar/在 Mac 上创建一个原生的工具栏。问题可能是我没有将其正确添加到 JFrame,或者可能误解了某些内容。

程序应该工作的方式是在工具栏上添加一个面板(或者在它下面,我认为 - 这还不清楚)。以防万一出现混淆:统一工具栏是常规工具栏,只是内部也有按钮。

这应该是这样的: enter image description here

这就是它的样子:(我使用不同外观的按钮并不重要,不是吗?) enter image description here

统一工具栏面板的代码:

package gui;
import java.awt.Color;
import java.awt.Window;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;

import com.jgoodies.forms.factories.Borders;

public class UnifiedToolbarPanel extends JPanel {

    public static final Color OS_X_UNIFIED_TOOLBAR_FOCUSED_BOTTOM_COLOR =
            new Color(64, 64, 64);
    public static final Color OS_X_UNIFIED_TOOLBAR_UNFOCUSED_BORDER_COLOR =
            new Color(135, 135, 135);    

    public UnifiedToolbarPanel() {
        // make the component transparent
        setOpaque(false);
        // create an empty border around the panel
        // note the border below is created using JGoodies Forms
        setBorder(Borders.createEmptyBorder("3dlu, 3dlu, 1dlu, 3dlu"));
    }



    @Override
    public Border getBorder() {
        Window window = SwingUtilities.getWindowAncestor(this);
        return window != null && window.isFocused()
                ? BorderFactory.createMatteBorder(0,0,1,0,
                        OS_X_UNIFIED_TOOLBAR_FOCUSED_BOTTOM_COLOR)
                : BorderFactory.createMatteBorder(0,0,1,0,
                       OS_X_UNIFIED_TOOLBAR_UNFOCUSED_BORDER_COLOR);
    }
}

JFrame 代码:

package gui;

import java.awt.EventQueue;
import gui.*;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.BorderLayout;

import javax.swing.ImageIcon;
import javax.swing.JSplitPane;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;

import java.awt.Color;
import javax.swing.plaf.metal.*;
public class HaiCue extends JFrame{
    /**
     * Launch the application.
     */
    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    HaiCue window = new HaiCue();
                    window.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public HaiCue() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        setForeground(Color.BLACK);
        setBounds(100, 100, 450, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        getRootPane().putClientProperty("apple.awt.brushMetalLook", Boolean.TRUE);

        JPanel panel = new UnifiedToolbarPanel();
//      panel.setLayout(new WrapLayout());
        add(panel, BorderLayout.NORTH); //<--- I think the problem may be how I add it... I have tried several different ways.

        ToolButton lblStop = new ToolButton("Stop", new ImageIcon(getClass().getResource("/images/stop.png")));
        panel.add(lblStop);

        ToolButton btnToolBox = new ToolButton("Tool Box", new ImageIcon(getClass().getResource("/images/Toolbox.png")));
        panel.add(btnToolBox);

        ToolButton btnInspector = new ToolButton("Inspector", new ImageIcon(getClass().getResource("/images/Toolbox.png")));
        panel.add(btnToolBox);
    }
}

我运行的是 OSX 10.8.2 和 Java 1.7.0_13

最佳答案

工具栏中按钮的首选尺寸很大程度上取决于所提供的图标的尺寸。请注意,pack() 对于使“Window 的大小适合其子组件的首选大小和布局”至关重要。下面的示例忽略了 article 中提出的一些细节。 ,但它捕捉到了基本的几何形状。使用 OptionPane.warningIcon 尝试一下,看看效果。

image

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
import javax.swing.UIManager;

/**
 * @see http://stackoverflow.com/a/16694524/230513
 */
public class Main {

    private void display() {
        JFrame f = new JFrame("Main");
        f.getRootPane().putClientProperty("apple.awt.brushMetalLook", true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(createToolBar(f), BorderLayout.NORTH);
        f.add(new JTextArea(5, 16));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private JToolBar createToolBar(final Component parent) {
        JToolBar bar = new JToolBar("Toolbar");
        bar.setFloatable(false);
        bar.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
        bar.add(createButton("FileChooser.detailsViewIcon"));
        bar.add(createButton("FileChooser.homeFolderIcon"));
        bar.add(createButton("FileChooser.newFolderIcon"));
        return bar;
    }

    private JButton createButton(String s) {
        JButton b = new JButton(UIManager.getIcon(s));
        b.setHorizontalTextPosition(JButton.CENTER);
        b.setVerticalTextPosition(JButton.CENTER);
        return b;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Main().display();
            }
        });
    }
}

关于java - Swing 中的统一工具栏无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16693214/

相关文章:

java - 在 Java 中,如何获得两个日期之间的秒数差异?

java - Gradle 脚本忽略 TestNG xml 文件

javascript - execCommand ('copy' ) 在 OS X 上的 Chrome 上失败

git fetch --tags --progress 在 Jenkins 中超时,在命令行上工作正常

java - java.awt.graphics 中图形的自定义方法

java - 使用 XML 解析器实现作为 OSGi 服务

java - JScrollPane 上的单杠

java - 使用 "really close?"对话框关闭 JFrame

c++ - 跨平台宏定义

java - 如何在Java Swing中制作按钮点击 block ?