Как получить единую панель инструментов в Quaqua?

Я не могу понять, как заставить Quaqua использовать единую панель инструментов в моем окне.

Я сделал все, что видел в другом посте, предлагающем исправить. Большинство людей, кажется, забывают setFloatable(false), но у нас это всегда было.

Во всяком случае, я сжал это до простого примера:

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;

import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.JDialog;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import ch.randelshofer.quaqua.QuaquaManager;

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

    @Override
    public void run() {
        try {
            UIManager.setLookAndFeel(QuaquaManager.getLookAndFeel());
        } catch (UnsupportedLookAndFeelException e) {
            // Ignore it.
        }

        JToolBar toolBar = new JToolBar();
        toolBar.putClientProperty("Quaqua.ToolBar.style", "title");
        toolBar.setFloatable(false);

        ButtonGroup paneButtonGroup = new ButtonGroup();
        for (int i = 1; i <= 3; i++) {
            JToggleButton button = new JToggleButton("Section " + i);
            button.setIcon(new PlaceholderIcon());
            button.setHorizontalTextPosition(SwingConstants.CENTER);
            button.setVerticalTextPosition(SwingConstants.BOTTOM);
            button.putClientProperty("JComponent.sizeVariant", "small");
            button.putClientProperty("Quaqua.Button.style", "toolBarTab");
            paneButtonGroup.add(button);
            toolBar.add(button);
        }

        JDialog dialog = new JDialog(null, "Preferences", Dialog.ModalityType.MODELESS);
        dialog.setLayout(new BorderLayout());
        dialog.add(toolBar, BorderLayout.PAGE_START);
        dialog.setSize(800, 600);
        dialog.setVisible(true);
    }

    private static class PlaceholderIcon implements Icon {
        @Override
        public void paintIcon(Component c, Graphics g, int x, int y) {
            Graphics2D g2d = (Graphics2D) g;
            g2d.setStroke(new BasicStroke(1.0f, BasicStroke.CAP_SQUARE,
                                          BasicStroke.JOIN_BEVEL, 1.0f,
                                          new float[] {  2.0f, 2.0f }, 1.0f));
            g2d.draw(new Rectangle(x, y, 32, 32));
        }

        @Override
        public int getIconWidth() {
            return 32;
        }

        @Override
        public int getIconHeight() {
            return 32;
        }
    }
}

Результат выглядит следующим образом:

скриншот моего примера

Так выглядит трансмиссия:

скриншот передачи

В нашем примере на панели инструментов отсутствует унифицированная заливка панели инструментов. Кроме того, вы не можете перетащить панель инструментов с помощью мыши, чтобы перетащить окно. Я уверен, что обе эти проблемы связаны с одной и той же проблемой, Quaqua почему-то не понимает, что я хочу, чтобы эта панель инструментов была унифицирована.

Я попытался установить apple.awt.brushMetalLook в корневой панели на true. Это отрицательно сказывается на том, что окно всегда выглядит отключенным, и ничего не делает, чтобы оно отображалось как единая панель инструментов.

(( Разные другие визуальные проблемы, не связанные с этим вопросом:

  1. Сглаживание текста не использует сглаживание в стиле ЖК-дисплея (это ошибка в Java 7, обходной путь которой неизвестен).
  2. Нет тиснения (думаю, я знаю, как это исправить, но это потребует создания моего собственного ButtonUI).
  3. Активная кнопка просто заштрихована темнее, в то время как реальная выглядит немного «вдавленной» (как ни странно, интерфейс AquaToggleButtonUI по умолчанию делает это правильно, так что это редкий случай, когда Quaqua обеспечивает менее родной вид, чем дефолт.) ))

person Trejkaz    schedule 18.12.2013    source источник
comment
Пробовали ли вы взглянуть на это,   -  person MadProgrammer    schedule 18.12.2013
comment
Вы пробовали читать мой вопрос? (указывая на место, где я сказал, что пытался настроить внешний вид матового металла на true)   -  person Trejkaz    schedule 19.12.2013
comment
Пробовали ли вы какие-либо другие настройки, предлагаемые в документе? Как, например, Quaqua.ToolBar .style установлено на gradient...   -  person MadProgrammer    schedule 19.12.2013
comment
Да, я пробовал градиент как для панели инструментов, так и для кнопок. По кнопкам разницы не заметил. Для панелей инструментов это делает панель инструментов блестящей.   -  person Trejkaz    schedule 19.12.2013
comment
Является ли Quaqua лучшим выбором в настоящее время после 10.5 улучшений к стандартному Аква ЛАФ?   -  person millimoose    schedule 13.01.2014
comment
Стандартный Aqua LAF по-прежнему размещает все неправильно. Хотя я думаю, что в некоторых ситуациях это дает лучший результат (например, RootPane, Button, ToggleButton).   -  person Trejkaz    schedule 13.01.2014


Ответы (1)


Вот чрезвычайно хакерское решение, которое основано на отключении битов Quaqua, чтобы заставить корневую панель работать правильно, поскольку я обнаружил, что внешний вид Aqua по умолчанию работает правильно.

Странные вещи:

  • Quaqua убирает рамку на кнопке панели инструментов.
  • Если вы попытаетесь использовать JDialog вместо JFrame, вы получите исходную проблему.

.

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.HashSet;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;

import ch.randelshofer.quaqua.QuaquaManager;

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

    @Override
    public void run() {
        try {
            QuaquaManager.setExcludedUIs(new HashSet<>(Arrays.<String>asList(
                "RootPane"
            )));
            UIManager.setLookAndFeel(QuaquaManager.getLookAndFeel());
        } catch (Exception ignored) {}

        JButton button = new JButton("Sheet me!");
        JToolBar toolBar = new JToolBar();
        JScrollPane content = new JScrollPane();
        JFrame frame = new JFrame();

        toolBar.setFloatable(false);
        toolBar.setOpaque(false);
        toolBar.add(button);

        frame.setLayout(new BorderLayout());
        frame.add(toolBar, BorderLayout.PAGE_START);
        frame.add(content, BorderLayout.CENTER);
        // Under current Aqua L&F, this doesn't actually look like brushed metal.
        // It looks like normal window titles.
        frame.getRootPane().putClientProperty("apple.awt.brushMetalLook", true);
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
person Trejkaz    schedule 12.01.2014