Альтернатива 1:
Имейте свою кнопку, чтобы расширить JButton. Вызвать setContentAreaFilled (false) для этой кнопки. Переопределите метод paintComponent () кнопки и нарисуйте фон так, как вам хотелось бы, а затем вызовите super.paintComponent () для рисования текста / метки.
Альтернатива 2:
Поскольку JLabel хорошо рисует текст и позиционирует этот текст по горизонтали и вертикали, я думаю, я бы воспользовался этим и делегировал фактический рисунок JLabel. Однако очевидно, что это проблема, поскольку вам нужен градиентный фон. Насколько я знаю, и рисование фона, и рисование текста выполняются одним и тем же методом (paintComponent ()) в JLabel, поэтому вы не можете использовать JLabel для рисования текста, но не фона.
То, что я бы сделал, это разрешил GreyButton расширить JPanel. Затем я создал бы класс, расширяющий PanelUI для рисования JPanel, и установил бы этот класс в качестве пользовательского интерфейса JPanel.
После этого я установил GridBagLayout в качестве менеджера по расположению на JPanel и добавил JLabel к JPanel. Менеджер по расположению гарантирует, что JLabel заполняет весь JPanel по горизонтали и вертикали. Таким образом, текст станет центром по центру JPanel.
Другими словами, в конструкторе JPanel я обязательно добавлю JLabel, используя что-то вроде:
JLabel label = new JLabel("Label");
GridBagLayout l = new GridBagLayout();
setLayout(l);
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.fill = GridBagConstraints.BOTH;
add(label, c0);
Скорее всего, вам придется немного поэкспериментировать с ограничениями, но вышеприведенный фрагмент кода должен послужить хорошим началом.