Java JTabbedPane 插入颜色

4
我想知道如何获取JTabbedPane的内嵌颜色。我似乎无法获得这个颜色。每次尝试都会得到236,236,236,这是外部框架颜色,而内部框架颜色要暗大约10,227,227,227(使用内置的苹果颜色计)。我正在使用UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())设置外观。
您可以在我在互联网上找到的一张图片中看到这一点。 http://pagesofinterest.net/wordpress/wp-content/uploads/2009/06/Quaqua-Maven-Netbeans.jpg 其中“Panel's Title”是我得到的不太有用的浅色区域。在圆角内部是我试图获取的较暗颜色。我尝试获取内容窗格的颜色,但没有成功。
感谢您的所有帮助!

**编辑:**添加了代码!如您所见,我正在尝试获取圆角区域内的颜色(如果您在Mac上),而不是框架或标签上的颜色,例如“1”“2”。我已经附上了一张照片,我想获取写有“Here”的部分的背景颜色。谢谢!

Screenshot

import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;

public class main {
JFrame frame;
Container c1 = new Container();
Container c2 = new Container();
JTabbedPane top = new JTabbedPane();
static main GUI;
public void createGUI(){
    frame = new JFrame();
    Container c = frame.getContentPane();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    top = new JTabbedPane(JTabbedPane.TOP);
    top.setFocusTraversalKeysEnabled(false);
    top.setFocusable(false);
    top.addTab("1", c1);
    top.addTab("2", c2);
    frame.setSize(315,450);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setResizable(true);
    c.add(top);
    frame.pack();
    frame.setVisible(true);
} 
public static void main(String[] args) {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
    catch(Exception e) {}
    GUI = new main();
    GUI.createGUI();
}
}

编辑: camickr,这是UIManager默认值的屏幕截图。不幸的是,它们中没有一个颜色是嵌入的正确颜色。

UI Manager Defaults


1
你能把你的代码放在这里吗?这样很好,我们可以更容易地给你建议 :) - akki0996
颜色是半渐变的,范围大约从RGB / 195、195、195到RGB / 208、208、208。 - MadProgrammer
感谢您的建议。在我的Mac上,当我运行程序时,在屏幕截图中带有“Here”的框内的圆角处根本没有渐变(使用Mac数字颜色计)。问题是我无法静态定义此颜色,因为在Windows上,此颜色完全不同。我需要找到一种方法来实现这种颜色的实用获取,以便稍后在我的程序中使用。再次感谢! - dannyn382
2个回答

2

谢谢camickr,我已经编辑了原帖以提供更多与您的回复相关的信息。 - dannyn382

1
您可以重写paintComponent(),在选项卡的背景中使用GradientPaint,如下所示。几点需要注意,
  • 让内容采用其内容的首选大小,如此处所示。

  • 事件分派线程中构建GUI。

  • 使用传统的Java命名。

附加说明:元素不总是在同一个位置,因此我不知道获取颜色的位置

听起来您想要匹配TabbedPaneUI代理内部使用的颜色。一种方法如下:

  • 生成组件的BufferedImage,如此处所示。

  • 确定相对于c1顶部的top点的坐标。

    Point p = SwingUtilities.convertPoint(c1, 0, -1, top);
    
  • 使用getRGB()获取颜色,如此处所示;使用Zoom验证结果。

Main image

import java.awt.Color;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

/** @see https://dev59.com/QHLYa4cB1Zd3GeqPVkMV#16625260 */
public class Main {

    JFrame frame;
    Container c1 = new GradientPanel();
    Container c2 = new GradientPanel();
    JTabbedPane top = new JTabbedPane();

    private static class GradientPanel extends JPanel {

        public GradientPanel() {
            this.add(new JLabel("Here"));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            GradientPaint p = new GradientPaint(0, 0, Color.white,
                getWidth(), getHeight(), Color.gray);
            g2d.setPaint(p);
            g2d.fillRect(0, 0, getWidth(), getHeight());
        }
    }

    public void createGUI() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        top = new JTabbedPane(JTabbedPane.TOP);
        top.addTab("1", c1);
        top.addTab("2", c2);
        frame.add(top);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

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

你好,Trashgod。感谢您的回复,但我不想改变颜色或添加任何渐变效果。我只是想获取颜色。 - dannyn382
啊,我明白了,你想匹配颜色,而不是改变它。我认为com.apple.laf.AquaLookAndFeel没有将该颜色公开为UIManager属性。你可以使用Robot,在这里中展示。 - trashgod
谢谢您的回复!我不确定如何在机器人中实现您提到的内容。您能帮助我使用它来获取颜色吗? - dannyn382
我知道颜色代码是什么,问题是每次程序启动时都必须在每台计算机上获取它。因此,每次启动程序时,我需要容器背景的颜色。在 Mac 上,它是灰色的。在 Windows 上,它几乎是白色的。问题不是只获取一次,而是每次程序启动时获取。我想做类似于 jtabpane.getBackground() 的事情,但这不会获取容器的颜色,只会获取选项卡的颜色。我需要找到一种方法来获取容器的颜色。再次感谢,希望现在更清楚了。 - dannyn382
你可以像这里所示一样渲染成bufferedImage,然后使用getRGB() - trashgod
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接