Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
639 views
in Technique[技术] by (71.8m points)

image - Design Button in Java (like in CSS)

For my project, I need to create customizable buttons. Except that I have a problem and I do not know how to solve it. I have a background image for my button and I would like it to be extensible in X and Y according to the text there will be over without loss of quality. Do you have any ideas?

background image example

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Swing has a pluggable Look&Feel which allows to alter the appearance of its widgets by means of a ComponentUI (in this case: a ButtonUI).

Example for your buttons:

enter image description here

class StyledButtonUI extends BasicButtonUI {

    @Override
    public void installUI (JComponent c) {
        super.installUI(c);
        AbstractButton button = (AbstractButton) c;
        button.setOpaque(false);
        button.setBorder(new EmptyBorder(5, 15, 5, 15));
    }

    @Override
    public void paint (Graphics g, JComponent c) {
        AbstractButton b = (AbstractButton) c;
        paintBackground(g, b, b.getModel().isPressed() ? 2 : 0);
        super.paint(g, c);
    }

    private void paintBackground (Graphics g, JComponent c, int yOffset) {
        Dimension size = c.getSize();
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(c.getBackground().darker());
        g.fillRoundRect(0, yOffset, size.width, size.height - yOffset, 10, 10);
        g.setColor(c.getBackground());
        g.fillRoundRect(0, yOffset, size.width, size.height + yOffset - 5, 10, 10);
    }
}

Main method for testing:

public static void main (String[] args) {
    JFrame f = new JFrame("Button UI Test");
    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    JPanel p = new JPanel();
    p.setBackground(Color.white);
    f.setContentPane(p);
    p.setLayout(new FlowLayout(5, 5));
    p.setBorder(new EmptyBorder(10, 10, 10, 10));

    for (int i = 1; i <= 5; i++) {
        final JButton button = new JButton("Button #" + i);
        button.setFont(new Font("Calibri", Font.PLAIN, 14));
        button.setBackground(new Color(0x2dce98));
        button.setForeground(Color.white);
        // customize the button with your own look
        button.setUI(new StyledButtonUI());
        p.add(button);
    }

    f.pack();
    f.setLocation(500, 500);
    f.setVisible(true);
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...