Возникли проблемы с рисованием пользовательских кнопок с помощью качелей - PullRequest
1 голос
/ 26 марта 2020

Я написал короткую программу, потому что хотел создать сделанную на заказ кнопку с закругленными углами. Поэтому я расширил класс JButton и переписал метод paintComponent (см. Код ниже).

public class JRoundedButton extends JButton {

private int arcRadius;

public JRoundedButton(String label, int arcRadius) {
    super(label);
    this.setContentAreaFilled(false);
    this.arcRadius = arcRadius;
}

@Override
protected void paintComponent(Graphics g) {
    if(g instanceof Graphics2D) {
        Graphics2D graphics = (Graphics2D) g;
        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        //Draw button background
        graphics.setColor(getBackground());
        graphics.fillRoundRect(getX(), getY(), getWidth() - 1, getHeight() - 1, arcRadius, arcRadius);
    }
}

@Override
public boolean contains(int x, int y) {
    return new RoundRectangle2D.Double(getX(), getY(), getWidth(), getHeight(), arcRadius, arcRadius).contains(x,y);
}

public int getArcRadius() {
    return arcRadius;
}

public void setArcRadius(int arcRadius) {
    this.arcRadius = arcRadius;
    this.repaint();
}

}

Когда я создаю простую рамку и добавляю ОДНУ кнопку на панель, которую я затем добавить к кадру, он обнаруживается отлично. Но как только я хочу создать две кнопки и расположить их друг под другом (используя Borderlayout, я использовал NORTH и SOUTH), только верхняя кнопка отображается правильно. Кнопка ниже отображает текст правильно (я удалил эту часть из метода painComponent (...)), но фон не закрашен. Я никоим образом не использую метод setOpaque (...).

В чем может быть проблема?

Нужно ли устанавливать границы моей пользовательской кнопки?

Редактировать: вот код, который создает рамку и отображает кнопки:

public static void main(String[] args) {
    JFrame frame = new JFrame("Buttontest");
    frame.setSize(new Dimension(500, 500));
    frame.setLayout(new BorderLayout());

    JPanel contentPanel = new JPanel();
    contentPanel.setSize(new Dimension(500, 500));
    contentPanel.setLayout(new GridLayout(2, 1, 0, 20));

    JRoundedButton button1 = new JRoundedButton("Rounded Button", 40);
    button1.setForeground(Color.YELLOW);
    button1.setBackground(Color.GREEN);
    JRoundedButton button2 = new JRoundedButton("Rounded Button 2", 40);
    button2.setBackground(Color.BLACK);
    button2.setForeground(Color.WHITE);

    contentPanel.add(button1);
    contentPanel.add(button2);

    frame.add(contentPanel, BorderLayout.CENTER);

    frame.setVisible(true);
}

Вывод такой:

frame showing only one button corrent

Почему фон нижней кнопки не виден? Это должно быть черным!

1 Ответ

1 голос
/ 06 апреля 2020

в вашем paintComponent() вам нужно fillRoundRect(0,0,...) вместо getX() и getY(), потому что g относительно самого компонента.

...