使用自定义外观创建JButton

8

输入图像说明

我对Java Swing不是很熟悉,对paint()也不太了解。我想在Java Swing中创建一个按钮,并使其具有上述外观。有人可以帮我做到这一点吗?任何指导都将不胜感激。谢谢提前。


2
除了背景和前景颜色,这个JButton有什么不同吗?在我看来它是一样的 :-) 为什么你不能使用button.setBackground(Color.BLUE.darker())button.setForeground(Color.LIGHT_GRAY.brighter())来改变JButton的字体,如果你想要更多的效果呢? - nIcE cOw
是的。我想让我的按钮看起来像Facebook上的扁平化样式,避免使用渐变。你能帮忙吗? - Nikhil
试试这个,非常接近你的喜好:button.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createBevelBorder( BevelBorder.RAISED, Color.BLUE.darker(), Color.BLACK), BorderFactory.createEtchedBorder(EtchedBorder.LOWERED))); button.setFont(new Font("Arial", Font.BOLD, 14)); - nIcE cOw
5个回答

16

我在谷歌上搜索了Facebook蓝的RGB值:59, 89, 182 / 十六进制代码为#3B5998和字体系列:Tahoma

使用这些信息,结合一些方法,如setFocusPainted(false)setBackground(new Color(59, 89, 182))setFont(new Font("Tahoma", Font.BOLD, 12)):

enter image description here

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Test {

    public Test() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());
        JButton b = new JButton("Log In");//http://www.chacha.com/question/what-are-the-rgb-values-for-the-background-color-of-comments-on-facebook
        b.setBackground(new Color(59, 89, 182));
        b.setForeground(Color.WHITE);
        b.setFocusPainted(false);
        b.setFont(new Font("Tahoma", Font.BOLD, 12));//http://answers.yahoo.com/question/index?qid=20070906133202AAOvnIP
        frame.add(b);
        frame.pack();
        frame.setVisible(true);
    }

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

除非你要寻找完全相同的内容(在我看来,如果不使用实际图像,这大概是最好的选择)......否则将按钮的图像设置为最佳方式。


@mKorbel 你能看到什么 :) - David Kroukamp
@nik 很高兴能帮到你,顺便说一句,我刚刚注意到你从未提到按钮是 Facebook 的,但它看起来确实像,所以我就按照那个模型设计了它。 - David Kroukamp

7

如果您想完全覆盖按钮的外观,最通用的解决方案是创建自己的ButtonUI

class MyButton extends BasicButtonUI {
    @Override
    public void paint(Graphics g, JComponent c) {
        AbstractButton b = (AbstractButton) c;
        ButtonModel model = b.getModel();
        ...
    }
}

您可以根据按钮的状态(悬停、聚焦、装备、按下等)绘制任何想要的内容。查看超类实现以获取如何执行此操作的基本思路。

然后只需设置要更改的按钮的用户界面:

button.setUI(new MyButton());

2

要创建一个像您示例中的自定义按钮,我认为最好的方法是准备一个图形文档(图像等),然后将其设置为您的按钮的属性:

JButton button = new JButton();
button.setIcon(new ImageIcon("yourButtonImage.jpg"));

我可以不用图标来完成吗? - Nikhil
是的,当然。准备一个自定义的.jpeg文件,并将其路径设置为ImageIcon实例,就像上面一样。 - Juvanis
@mKorbel:真的吗,我不知道那个东西,希望我能在某个地方看到一个例子!! - nIcE cOw
1
@Gagandeep Bali [例如,确保此图像没有正确的格式和比例](https://dev59.com/YlzUa4cB1Zd3GeqP5KbD#7919280) - mKorbel
1
@Gagandeep Bali,有三种方法(我认为它们都是适当的方法)可以使用Icon、paintComponent、override BasicButtonUI(或修改/设置ColorUIResource的颜色数组)。 - mKorbel
显示剩余2条评论

2
在Oracle javadoc上,您可以看到jbutton javadoc
JButton的Java方法`setIcon(Icon)`使用`ImageIcon`实现即可轻松完成!

1
要创建一个在您示例中显示的定制按钮,我认为可以使用以下代码:
JButton button = new JButton("Log In");
button.setFont(new Font("Serif",Font.BOLD,20));
button.setBackground(new Color(0,51,204));//import java.awt.Color;
button.setForeground(Color.WHITE);
button.setFocusPainted(false);
button.setBorderPainted(false);

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