Java пользовательская кнопка paintComponent не перерисовывает фон кнопки по умолчанию

Я делаю пользовательскую кнопку в Swing на Java. Вот как выглядят мои кнопки:

Я хочу светло-серую кнопку с закругленными углами, я хочу добавить немного изображения позже.

Проблема в том, когда я переопределить paintComponent(), серый округлый будет нарисован, но вы видите старый синий фон Swing после него. Углы кнопки должны быть прозрачными.

Это мой пакет кода игры;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JButton;

public class ItemButton extends JButton {

    public ItemButton(String text) {

        super(text);
        this.setBorderPainted(false);
        this.setBorder(null);

    }

    @Override
    public void paintComponent(Graphics g) {

        super.paintComponent(g);

        Graphics2D g2 = (Graphics2D) g;

        g2.setColor(new Color(220, 220, 220));
        g2.fillRoundRect(0, 0, this.getWidth() - 10, this.getHeight() - 10, 10, 10);
    }

}

2 ответа

Решение

Я не уверен, почему вы хотите сделать это так, как JButton позволяет вам поставлять Icon образ, но все равно...

Есть способ сделать это, используя JButton, но это не правильно, вместо этого вы должны начать с AbstractButton поскольку у него нет рисования делегата пользовательского интерфейса, например...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.AbstractButton;
import javax.swing.DefaultButtonModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class CustomButton {

    public static void main(String[] args) {
        new CustomButton();
    }

    public CustomButton() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends AbstractButton {

        public TestPane() {
            setModel(new DefaultButtonModel());
            MouseHandler mh = new MouseHandler();
            addMouseListener(mh);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(40, 20);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics g2d = (Graphics2D) g.create();
            g2d.setColor(new Color(220, 220, 220));
            g2d.fillRoundRect(0, 0, this.getWidth() - 1, this.getHeight() - 1, 10, 10);
            if (getModel().isRollover()) {
                g2d.setColor(new Color(128, 128, 128));
                g2d.drawRoundRect(0, 0, this.getWidth() - 1, this.getHeight() - 1, 10, 10);
            }
            g2d.dispose();
        }

        public class MouseHandler extends MouseAdapter {

            @Override
            public void mouseEntered(MouseEvent e) {
                getModel().setRollover(true);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                getModel().setRollover(false);
            }

            @Override
            public void mousePressed(MouseEvent e) {
                getModel().setArmed(true);
                getModel().setPressed(true);
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                getModel().setPressed(false);
                getModel().setArmed(false);
            }

        }

    }

}

Есть два пути

  1. переопределение getPrefferedSize внутри класса ItemButton

  2. правильно использовать LayoutManager Я бы начал с GridLayout

Другие вопросы по тегам