Java 我可以在Mac OS X上获得Swing的本地外观JPopupMenu吗?

Java 我可以在Mac OS X上获得Swing的本地外观JPopupMenu吗?,java,macos,swing,jpopupmenu,quaqua,Java,Macos,Swing,Jpopupmenu,Quaqua,我试图使Swing中的组合框(在Java7下)看起来像本地组合框。原来是用一个JPopupMenu来显示组合框的选项,所以它变成了一个使JPopupMenu看起来足够自然的问题 如果我使用默认的Aqua外观,我会得到正方形的边缘,这一点都不正确,所以我们会马上放弃这个想法。当然,我们可以求助于Quaqua,它应该能解决这类问题 public class PopupMenuTest implements Runnable { public static void main(String[]

我试图使Swing中的组合框(在Java7下)看起来像本地组合框。原来是用一个
JPopupMenu
来显示组合框的选项,所以它变成了一个使
JPopupMenu
看起来足够自然的问题

如果我使用默认的Aqua外观,我会得到正方形的边缘,这一点都不正确,所以我们会马上放弃这个想法。当然,我们可以求助于Quaqua,它应该能解决这类问题

public class PopupMenuTest implements Runnable {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new PopupMenuTest());
    }

    @Override
    public void run() {
        try {
            UIManager.setLookAndFeel(QuaquaManager.getLookAndFeel());
            // Uncomment this for the second example
            //PopupFactory.setSharedInstance(new CustomisedScreenPopupFactory());
        } catch (Exception ignore) {}

        JComboBox<String> comboBox = new JComboBox<>();
        comboBox.setModel(new DefaultComboBoxModel<>(
            new String[] { "One", "Two", "Three" }));

        JFrame frame = new JFrame("Test");
        frame.setLayout(new FlowLayout());
        frame.add(comboBox);
        frame.setSize(300, 200);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
公共类PopupMenuTest实现可运行{
公共静态void main(字符串[]args){
invokeLater(新的PopupMenuTest());
}
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(QuaquaManager.getLookAndFeel());
//对第二个示例取消注释
//setShareInstance(新的CustomisedScreenPoopFactory());
}捕获(异常忽略){}
JComboBox comboBox=新的JComboBox();
setModel(新的DefaultComboxModel(
新字符串[]{“一”、“二”、“三”});
JFrame=新JFrame(“测试”);
frame.setLayout(新的FlowLayout());
frame.add(组合框);
框架。设置尺寸(300200);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
}
这给了我很多

在上面注释掉代码的地方,我尝试在自定义屏幕弹出工厂中进行干扰

public class CustomisedScreenPopupFactory extends PopupFactory {
    private final PopupFactory delegate;

    public CustomisedScreenPopupFactory() {
        PopupFactory delegate;
        try {
            Class<? extends PopupFactory> clazz =
                Class.forName("com.apple.laf.ScreenPopupFactory")
                    .asSubclass(PopupFactory.class);
            Constructor<? extends PopupFactory> constructor =
                clazz.getDeclaredConstructor();
            constructor.setAccessible(true); // hacks
            delegate = constructor.newInstance();
        } catch (Exception ignore) {
            delegate = new PopupFactory(); // has to be set to something
        }
        this.delegate = delegate;
    }

    @Override
    public Popup getPopup(Component owner, Component contents, int x, int y) {
        Popup popup = delegate.getPopup(owner, contents, x, y);

        try {
            Method method = Popup.class.getDeclaredMethod("getComponent");
            method.setAccessible(true);
            Component component = (Component) method.invoke(popup);
            if (component instanceof JWindow) {    // always is, so far
                JWindow window = (JWindow) component;
                JRootPane rootPane = window.getRootPane();

                // This call here is what all the rest of the boilerplate was
                // added in order to access.
                AWTUtilities.setWindowOpaque(window, false);
            }
        } catch (Exception e) {
            Logger.getLogger(getClass()).error("Couldn't customise the popup window", e);
        }

        return popup;
    }
}
公共类CustomisedScreenpoppupFactory扩展了PopupFactory{
私人工厂代表;
公共定制CreenPopupFactory(){
PopupFactory代表;
试一试{

Class您可以匹配系统的外观和感觉,如下所示:

    try{
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName);
    catch(Exception e){}
这就得到了系统L&F,无论如何,它比外部L&F更原始


希望这有帮助!

您可以匹配系统的外观和感觉,如下所示:

    try{
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName);
    catch(Exception e){}
这就得到了系统L&F,无论如何,它比外部L&F更原始


希望这能有所帮助!

Quaqua外观源自10.5版本之前的版本,基于组合框的gumdrop蓝色,在任何实际运行Java 7的系统上都会显得非常不合适。如果您想获得与组合框的本机外观相似的效果,请坚持使用系统外观,但要使其可编辑OOK更像本机的。我发现本机的弹出窗口缺少圆角。使其可编辑会使其向下弹出,这对于本应用于选择选项的组合框来说更不正确。弹出窗口通常用于选择要执行的操作的情况,这是微妙的不同。Si我已经启动了一个名为Haqua的项目,为所有这些东西提供了一个黑客解决方案。我的错是,我把弹出按钮和组合框混在了一起。它们是完全不同的东西。Quaqua的外观和感觉来自10.5之前??基于组合框的gumdrop蓝色,它看起来真的不适合任何一个实际上运行的是Java 7。如果您想获得与组合框的本机外观相似的效果,请坚持使用系统外观,但要使其可编辑。这看起来更像本机外观。我发现本机上的弹出窗口缺少圆角。而使其可编辑会使其向下弹出,这更不正确t代表组合框,该组合框用于选择选项。弹出框通常用于选择要执行的操作的情况,这是微妙的不同。发布此消息后,我启动了一个名为Haqua的项目,以实现所有这些内容的黑客解决方法。糟糕的是,我混淆了弹出按钮和组合框。它们是共同的完全不同的事情。