gpt4 book ai didi

java - 如何在 Quaqua 中获得统一的工具栏?

转载 作者:行者123 更新时间:2023-11-29 08:55:10 26 4
gpt4 key购买 nike

我不知道如何强制 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;
}
}
}

结果是这样的:

screenshot of my example

这是传输的样子:

screenshot of Transmission

我们的示例工具栏缺少统一的工具栏底纹。还有,不能用鼠标拖动工具栏来拖动窗口。我敢肯定这两个问题都源于同一个问题,Quaqua 不知何故没有意识到我想要统一这个工具栏。

我已尝试将根 Pane 上的 apple.awt.brushMetalLook 设置为 true。这会产生负面影响,使窗口始终看起来处于禁用状态,并且无助于将其显示为统一的工具栏。

((与此问题无关的其他视觉问题:

  1. 文本抗锯齿未使用 LCD 式抗锯齿(这是 Java 7 中的错误,没有已知的解决方法。)
  2. 没有浮雕(我想我知道如何解决这个问题,但这将涉及制作我自己的 ButtonUI。)
  3. Activity 按钮只是阴影更深,而在真实的按钮中,有一点“被插入”的外观(奇怪的是,默认的 AquaToggleButtonUI 正确地做到了这一点,所以 Quaqua 提供了一个不太原生的情况很少见看起来比默认的。)))

最佳答案

这是一个非常 hacky 的解决方案,它依赖于禁用 Quaqua 的一些位来让根 Pane 做正确的事情,因为我发现默认的 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);
}
}

关于java - 如何在 Quaqua 中获得统一的工具栏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20650148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com