Добавление пользовательского JButton в JFrame меняет цвет фона - PullRequest
1 голос
/ 24 марта 2020

Я создал простой GUI, потому что я хотел создать закругленную кнопку JButton вместо обычной кнопки. Поэтому я создал класс, который расширяет JButton и переопределяет некоторые методы для рисования.

Но как только я выполняю код (используя Java 13), рамка создается с уродливым желтым цветом, после этого кнопка включена и весь цвет фона JFrame изменяется. Почему это и как я могу предотвратить это? Я только хочу, чтобы кнопка была создана, но ничего другого, чтобы изменить цвет или подобный.

public class RoundedButton extends JButton {

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

    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.setSize(new Dimension(200, 200));

    JButton button = new RoundedButton("Text", 40, 2F, Color.BLACK);
    button.setBackground(new Color(116, 10, 10));
    button.setForeground(Color.WHITE);
    button.setSize(new Dimension(200, 120));
    button.setPreferredSize(new Dimension(200, 120));
    button.addMouseListener(new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {
        }

        @Override
        public void mousePressed(MouseEvent e) {
        }

        @Override
        public void mouseReleased(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
            button.setBackground(button.getBackground().brighter().brighter());
        }

        @Override
        public void mouseExited(MouseEvent e) {
            button.setBackground(button.getBackground().darker().darker());
        }
    });


    panel.add(button, BorderLayout.CENTER);
    frame.add(panel, BorderLayout.NORTH);
    frame.setBackground(Color.YELLOW);
    //frame.pack();
    frame.setVisible(true);
}




private int arcRadius;
private float borderSize;
private Color borderColor;

public RoundedButton(String label, int arcRadius, float borderSize, Color borderColor) {
    super(label);
    this.setContentAreaFilled(false);
    this.arcRadius = arcRadius;
    this.borderSize = borderSize;
    this.borderColor = borderColor;
}


@Override
public void paint(Graphics g) {
    if(g instanceof Graphics2D) {
        ((Graphics2D) g).setStroke(new BasicStroke(borderSize));
        ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    }

    //Draw background / fill button
    g.setColor(this.getBackground());
    g.fillRoundRect(getX(), getY(), this.getWidth(), (int)(this.getHeight()-borderSize), arcRadius, arcRadius);

    //Draw border
    g.setColor(borderColor);
    g.drawRoundRect(getX(), getY(), this.getWidth(), (int)(this.getHeight()-borderSize), arcRadius, arcRadius);

    //Draw font
    if (this.getFont() != null && this.getText() != null) {
        FontMetrics fm = getFontMetrics(getFont());
        g.setColor(this.getForeground());
        g.drawString(this.getText(), ((this.getWidth() / 2) - (fm.stringWidth(this.getText()) / 2)),
                    ((this.getHeight() / 2) + fm.getMaxDescent()));
    }
}

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

@Override
public void updateUI() {
    super.updateUI();
    this.setContentAreaFilled(false);
    this.setFocusPainted(false);
}

}

Если я добавлю это к рамке, цвет фона изменится , Почему это так?

1 Ответ

1 голос
/ 24 марта 2020

Графический объект, переданный методу рисования компонента, уже должен быть переведен в позицию компонента. Таким образом, все ваше рисование должно быть выполнено в пределах (0,0) и (ширина, высота).

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

В частности: g.drawRoundRect (0, 0, ...

Редактировать отвечая на редактирование вопроса: BorderLayout является своего рода неопределенным, когда вы добавляете что-то просто к СЕВЕРУ, но в CENTER ничего не происходит. Кроме того, предпочтительные размеры панели и кнопки игнорируются при помещении в центр макетов границ.

...