Изменить цвет границы JButton в Java Swing, сохраняя вставки - PullRequest
3 голосов
/ 16 мая 2019

Я хочу изменить цвет границы компонента JButton в Java Swing.

Я пробовал следующее:

package com.example.test;

import java.awt.Color;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test extends JFrame {

    public Test() {

        JPanel panel = new JPanel();
        JButton button1 = new JButton("Test Button 1");
        JButton button2 = new JButton("Test Button 2");
        button2.setBorder(BorderFactory.createLineBorder(Color.RED));

        panel.add(button1);
        panel.add(button2);

        this.add(panel);


        setSize(400, 400);
        setVisible(true);

    }

    public static void main(String[] args) {

        try {
            UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedLookAndFeelException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
        Test t = new Test();
    }
}

Это генерирует две кнопки, на компоненте button2 я пытаюсь изменить цвет границы, но он удаляет отступы. Есть ли способ сохранить оригинальные вставки стандартного JButton и просто изменить цвет?

Примечание: я предполагаю, что при назначении новой Границы вставки удаляются. Но я не уверен на 100% в этом.

JButton Change Border Color

1 Ответ

4 голосов
/ 16 мая 2019

Вместо создания LineBorder используйте CompoundBorder:

button2.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createLineBorder(Color.RED, 1), 
            BorderFactory.createEmptyBorder(
                button1.getBorder().getBorderInsets(button1).top, 
                button1.getBorder().getBorderInsets(button1).left, 
                button1.getBorder().getBorderInsets(button1).bottom, 
                button1.getBorder().getBorderInsets(button1).right)));

Я взял BorderInsets за button1, чтобы они оба имели одинаковый размер.

Мой ответ основан на ответе @MadProgrammer для на этот вопрос

enter image description here


Кстати, не расширяйте JFrame, вместо этого создайте его экземпляр, и если вам действительно нужно расширить компонент, будь то JPanel: Расширяет JFrame по сравнению с его созданием внутри программы

Также не забудьте позвонить

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

На вашем JFrame экземпляре, чтобы ваша программа закрывалась при закрытии.

А также вы пропустили размещение своей программы на EDT, подробнее об этом на этом ответе

...