java - 如何在 Synth LaF 中自定义 jScrollbar 的外观?

标签 java css swing synth

在我们的应用程序中,我们必须使用 css 来自定义 Swing 组件的外观。现在我们有一些手动编写的 css 引擎,但是它很慢并且需要大量额外的代码才能应用一个 css 文件。所以现在我们尝试使用 Synth 外观和感觉来使 ui 更改更加原生

对于大多数组件,我们设置名称并使用它们绑定(bind)到样式。但也有几个滚动条,它们具有不同的 css 和不同的外观。影响滚动条拇指的唯一方法是用户区域 ScrollBarThumb,我们无法为其设置名称,因为它不是 JComponent。由于使用区域而不是名称,因此不可能有不同的外观。有什么解决方法吗?

最佳答案

enter image description here enter image description here

来自代码(Java6)

import com.sun.java.swing.Painter;
import java.awt.Color;
import java.awt.Graphics2D;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class ScrollDemo extends JFrame {

    private static final long serialVersionUID = 1L;

    public ScrollDemo() {
        JTextField field = new JTextField();
        String[] columnNames = {"Column"};
        Object[][] data = {
            {"A"}, {"B"}, {"C"}, {"D"}, {"E"}, {"F"},
            {"A"}, {"B"}, {"C"}, {"D"}, {"E"}, {"F"},
            {"A"}, {"B"}, {"C"}, {"D"}, {"E"}, {"F"},
            {"A"}, {"B"}, {"C"}, {"D"}, {"E"}, {"F"},
            {"A"}, {"B"}, {"C"}, {"D"}, {"E"}, {"F"},};

        add(new JScrollPane(new JTable(data, columnNames)));
        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Exception fail) {
        }
        UIManager.getLookAndFeelDefaults().put("ScrollBar:ScrollBarThumb[Enabled].backgroundPainter",
                new FillPainter(new Color(255, 169, 191)));
        UIManager.getLookAndFeelDefaults().put("ScrollBar:ScrollBarThumb[MouseOver].backgroundPainter",
                new FillPainter(new Color(127, 255, 191)));
        UIManager.getLookAndFeelDefaults().put("ScrollBar:ScrollBarTrack[Enabled].backgroundPainter",
                new FillPainter(new Color(0, 212, 255)));
        UIManager.getLookAndFeelDefaults().put("ScrollBar:\"ScrollBar.button\".size", 20);
        //UIManager.getLookAndFeelDefaults().put("ScrollBar.decrementButtonGap", 10);
        //UIManager.getLookAndFeelDefaults().put("ScrollBar.incrementButtonGap", 10);
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                ScrollDemo scrollDemo = new ScrollDemo();
            }
        });
    }
}

class FillPainter implements Painter<JComponent> {

    private final Color color;

    public FillPainter(Color c) {
        color = c;
    }

    @Override
    public void paint(Graphics2D g, JComponent object, int width, int height) {
        g.setColor(color);
        g.fillRect(0, 0, width - 1, height - 1);
    }
}

关于java - 如何在 Synth LaF 中自定义 jScrollbar 的外观?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11347285/

相关文章:

java - 如何从ContainerRequest JERSEY 1.10获取IP?

html - 当中间列比其他列大时,在 bootstrap 布局中从 3 列切换到 2 列

javascript - 如何生成 HTML 页面的缩略图

java - 修改JLabel的ImageIcon

java - 切割字符串java

java - 如何从 iserialnumber 获取 USB 设备序列号?

java - 如何在 JSF 2.0 中获取选项卡式 Pane 组件 (Sun Mojarra)

css - HTML/CSS : strange scroll bar appears next to my images

java - 调整网格布局上面板的大小

Java JEditorPane 不显示图像