java - 基本ScrollBarUI?如何使用它

标签 java swing user-interface

我正在为 Minecraft 开发一个代码编辑器,我对 Java 中的正常 UI 设计不太满意。我设法更改按钮,但它对滚动条不起作用。你能帮我一下吗?

这是我的 ButtonUI 类。

public class UIButton extends BasicButtonUI implements MouseListener {

    private Color hoverColor;
    private Color normalColor;
    private Color pressedColor;

    public UIButton(ColorSheme cs) {
        super();
        if (cs == ColorSheme.WHITE_BLUE_GRAY) {
            hoverColor = new Color(212, 211, 255);
            normalColor = new Color(184, 183, 206);
            pressedColor = new Color(197, 196, 228);
        }else if (cs == ColorSheme.GREEN_GRAY) {
            hoverColor = new Color(22, 179, 103);
            normalColor = new Color(9, 126, 101);
            pressedColor = new Color(17, 158, 102);
        }else if (cs == ColorSheme.RED_GRAY) {
            hoverColor = new Color(204, 86, 88);
            normalColor = new Color(171, 79, 91);
            pressedColor = new Color(187, 82, 90);
        }else if (cs == ColorSheme.BLUE_GRAY) {
            hoverColor = new Color(126, 176, 191);
            normalColor = new Color(104, 134, 179);
            pressedColor = new Color(111, 148, 183);
        }
    }

    @Override
    public void installUI(JComponent c) {
        super.installUI(c);
        c.addMouseListener(this);
        c.setBorder(null);
        c.setFont(Main.getDefaultFont());
    }

    @Override
    public void uninstallUI(JComponent c) {
        super.uninstallUI(c);
        c.removeMouseListener(this);
    }

    @Override
    protected void installDefaults(AbstractButton b) {
        super.installDefaults(b);
        changeButtonColor((JButton) b, normalColor);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        changeButtonColor((JButton) e.getComponent(), hoverColor);
    }

    @Override
    public void mousePressed(MouseEvent e) {
        changeButtonColor((JButton) e.getComponent(), pressedColor);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        changeButtonColor((JButton) e.getComponent(), normalColor);
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        changeButtonColor((JButton) e.getComponent(), hoverColor);
    }

    @Override
    public void mouseExited(MouseEvent e) {
        changeButtonColor((JButton) e.getComponent(), normalColor);
    }

    private void changeButtonColor(JButton b, Color c) {
        b.setBackground(c);
    }
}

这是我的 UIScrollBarUI 类。

public class UIScrollBar extends BasicScrollBarUI implements MouseListener {

    private Color hoverColor;
    private Color normalColor;
    private Color pressedColor;

    public UIScrollBar(ColorSheme cs) {
        super();
        if (cs == ColorSheme.WHITE_BLUE_GRAY) {
            hoverColor = new Color(212, 211, 255);
            normalColor = new Color(184, 183, 206);
            pressedColor = new Color(197, 196, 228);
        }else if (cs == ColorSheme.GREEN_GRAY) {
            hoverColor = new Color(22, 179, 103);
            normalColor = new Color(9, 126, 101);
            pressedColor = new Color(17, 158, 102);
        }else if (cs == ColorSheme.RED_GRAY) {
            hoverColor = new Color(204, 86, 88);
            normalColor = new Color(171, 79, 91);
            pressedColor = new Color(187, 82, 90);
        }else if (cs == ColorSheme.BLUE_GRAY) {
            hoverColor = new Color(126, 176, 191);
            normalColor = new Color(104, 134, 179);
            pressedColor = new Color(111, 148, 183);
        }
    }

    @Override
    public void installUI(JComponent c) {
        super.installUI(c);
        c.addMouseListener(this);
        c.setBorder(null);
    }

    @Override
    public void uninstallUI(JComponent c) {
        super.uninstallUI(c);
        c.removeMouseListener(this);
    }

    @Override
    public void mouseClicked(MouseEvent e) {

    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.print("Entered");
        changeBarColor(e.getComponent(), hoverColor);
    }

    @Override
    public void mouseExited(MouseEvent e) {
        System.out.print("Exited");
    }

    private void changeBarColor(Component c, Color co) {
        c.setBackground(co);
    }
}

最佳答案

首先,如果您对“正常”UI 设计不满意,您应该考虑更改外观和感觉。 我个人讨厌 MetalLookAndFeel,并且习惯于为我的 swing 应用程序设置依赖于系统的外观和感觉。 检查this链接以获取更多详细信息。

如果您只想更改轨道和/或 slider 颜色,您可以重写 BasicScrollBarUI PaintThumb 和 PaintTrack 方法。

滚动条的按钮也可以更改。

尝试这个示例(下面的屏幕截图):

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicScrollBarUI;
public class Main
{
    public static void main (String [] a) {
        SwingUtilities.invokeLater (new Runnable () {
            @Override public void run () {
                try {
                    UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName ());
                    createAndShowGUI ();
                }
                catch (Exception e) {
                    JOptionPane.showMessageDialog (null, "An unexpected error occurred : " + e.getClass ().getSimpleName (), "Error", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
    }
    private static void createAndShowGUI () {
        JFrame frame = new JFrame ("Test ScrollBar");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.setContentPane (new CustomScrollPane ());
        frame.pack ();
        frame.setLocationRelativeTo (null);
        frame.setVisible (true);
    }
}
class CustomScrollPane extends JScrollPane
{
    public CustomScrollPane () {
        super (VERTICAL_SCROLLBAR_ALWAYS, HORIZONTAL_SCROLLBAR_ALWAYS);
        Image imageThumb = createImage (16, 16, Color.RED);
        Image imageThumbPressed = createImage (16, 16, Color.MAGENTA);
        Image imageTrack = createImage (16, 16, Color.YELLOW);
        // Adding some test labels
        JPanel view = new JPanel (new GridLayout (10, 5, 20, 50));
        for (int i = 0; i < 50; i++) view.add (new JLabel ("Test Label " + String.valueOf (i)));
        setViewportView (view);
        setHorizontalScrollBar (new CustomScrollBar (JScrollBar.HORIZONTAL, imageThumb, imageThumbPressed, imageTrack));
        setVerticalScrollBar (new CustomScrollBar (JScrollBar.VERTICAL, imageThumb, imageThumbPressed, imageTrack));
        // Setting preferred size for convenience. Not a good practice !
        setPreferredSize (new Dimension (200, 200));
    }
    private Image createImage (int width, int height, Color color) {
        BufferedImage image = new BufferedImage (width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics g = image.getGraphics ();
        g.setColor (color);
        g.fillRect (0, 0, width, height);
        g.dispose ();
        return image;
    }
}
class CustomScrollBar extends JScrollBar
{
    private boolean isThumbPressed;

    public CustomScrollBar (final int orientation, final Image thumb, final Image thumbPressed, final Image track) { 
        super (orientation);
        addMouseListener (new MouseAdapter () {
            public void mousePressed (MouseEvent e) {
                isThumbPressed = true;
            }
            public void mouseReleased (MouseEvent e) {
                isThumbPressed = false;
            }
        });
        setUI (new BasicScrollBarUI () {
            @Override protected void paintThumb (Graphics g, JComponent c, Rectangle r) {
                if (isThumbPressed) g.drawImage (thumbPressed, r.x, r.y, r.width, r.height, null);
                else g.drawImage (thumb, r.x, r.y, r.width, r.height, null);
            }
            @Override protected void paintTrack (Graphics g, JComponent c, Rectangle r) {
                g.drawImage(track, r.x, r.y, r.width, r.height, null);
            }
        });
    }
}

GUI screenshot

关于java - 基本ScrollBarUI?如何使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44432037/

相关文章:

c++ - 简单的OpenGL GUI框架用户交互建议?

java - javascript 图表库是否可自定义或与 JavaFX 兼容

java - 从多层ObjectNode中检索线结构

java - 删除包含某个字母的字符串的 JTable 行

java - 在没有 null 布局的 Swing 中绕过组件的布局

java - 想要我的 JButton 返回上一个文本区域

java - java中在另一个类的构造函数中调用一个类

java - Hibernate Validator 不起作用,但我不知道为什么

java - 我如何检查一个框架在java中是否打开?

Java - 在单个 gui 中显示静态 fileChooser 面板和动态复选框面板