Настройки кнопок JFileChooser

Я работаю над тем, чтобы дать JFileChooser градиентный фон. С помощью StackOverflow я смог задать фон градиента для JFileChooser, но кнопки в JFilechooser по-прежнему имеют белый фон. Есть ли способ удалить это?

package javaapplication2;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Point;
import java.awt.RenderingHints;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.UIManager;

/**
 *
 * @author navpreet.kaur
 */
class MyFileChooser extends JFileChooser {

    private final Color color1 = Color.DARK_GRAY;
    private final Color color2 = new Color(0, 0, 0, 0.65f); //Color.BLACK;
    final Color color3 = new Color(0, 0, 0, 0.33f);
    private final Color color4 = new Color(0, 0, 0, 0.0f);

    private final int shadowHeight = 20;
    private final GradientPaint mainGradient;
    private final GradientPaint shadowGradient;

    java.net.URL defaultViewURL = IRLookAndFeel.class.getResource("DefaultView_Icon.png");
    java.net.URL detailsViewURL = IRLookAndFeel.class.getResource("DetailsView_Icon.png");
    java.net.URL homeFolderURL = IRLookAndFeel.class.getResource("Home_Icon.png");
    java.net.URL listViewURL = IRLookAndFeel.class.getResource("listView_Icon.png");
    java.net.URL newFolderURL = IRLookAndFeel.class.getResource("Newfolder.png");
    java.net.URL upFolderURL = IRLookAndFeel.class.getResource("Upfolder.png");

    ImageIcon fcDefaultViewIcon = new ImageIcon(defaultViewURL);
    ImageIcon fcDetailsViewIcon = new ImageIcon(detailsViewURL);
    ImageIcon fcHomeFolderIcon = new ImageIcon(homeFolderURL);
    ImageIcon fcListViewIcon = new ImageIcon(listViewURL);
    ImageIcon fcNewFolderIcon = new ImageIcon(newFolderURL);
    ImageIcon fcUpFolderIcon = new ImageIcon(upFolderURL);

    public MyFileChooser() {
        Component[] comps = getComponents();
        recursiveTransparent(comps);

        mainGradient = new GradientPaint(0, 0, color1, 0, 600, color2);
        shadowGradient = new GradientPaint(0, 0, color3, 0, shadowHeight, color4);

           UIManager.put("FileChooser.detailsViewIcon", fcDetailsViewIcon);
           UIManager.put ("FileChooser.homeFolderIcon", fcHomeFolderIcon);
           UIManager.put ("FileChooser.listViewIcon", fcListViewIcon);
           UIManager.put ("FileChooser.newFolderIcon", fcNewFolderIcon);
           UIManager.put ("FileChooser.upFolderIcon", fcUpFolderIcon);
           UIManager.put ("FileChooser.viewMenuIcon", fcDefaultViewIcon);
    }

    private void recursiveTransparent(Component[] comps) {
        for (Component comp : comps) {
            if (comp instanceof JComponent && !(comp instanceof JList)) {
                ((JComponent) comp).setOpaque(false);
            }
            if (comp instanceof Container) {
                Component[] subComps = ((Container) comp).getComponents();
                recursiveTransparent(subComps);
            }
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
      super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

        int width = getWidth();
        int height = getHeight();


        g2d.setPaint(mainGradient);
        g2d.fillRect(0, 0, width, height);

        g2d.setPaint(shadowGradient);
        g2d.fillRect(0, 0, width, shadowHeight);
    }
}`

Я пробовал использовать свойства UIManager, но ничего не помогает. Мой вопрос о том, как я могу изменить значки и кнопки ОК и Отмена в JFilechooser?

! [введите описание изображения здесь] [1]

С упомянутым кодом u я могу делать кнопки и метки в JFilechooser

  if (comp instanceof JButton) {
             JButton b =  (JButton) comp;
             b.setContentAreaFilled(false);
             b.setForeground(Color.white);
             b.setOpaque(false);
             b.setBorderPainted(true);
        }

        if (comp instanceof JLabel) {
             JLabel l =  (JLabel) comp;
             l.setForeground(Color.white);
        }

но затем есть поле со списком с JFilechooser. Я также пытаюсь изменить свойства, но JComboBox не следует L и F. Что я могу сделать?

Забудьте о JFileChooser. Сначала узнайте, как настроить JButton, добавляемый на панель. Весь код выбора файла не имеет отношения к проблеме настройки одной кнопки. Задайте вопрос, чтобы упростить задачу. Проблема в том, что LAF берет на себя управление отрисовкой JButtons. Пока вы не решите эту более простую проблему, вы не сможете исправить средство выбора файлов.

camickr 01.11.2018 17:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
329
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

LAF управляет фоновой окраской JButton, чтобы дать вам простую градиентную окраску в Widows. Другой LAF может делать что-то другое.

Если вы хотите отключить это, вы можете попробовать:

JButton button = new JButton( "Text Button" );
button.setContentAreaFilled( false );

Теперь будет виден фон панели.

Большое вам спасибо, Camickr! . Я выполнил настройку кнопок и меток на JFileChooser. Что касается JCombo Boxes, я могу установить там фон, но список в полях со списком искажен. Как я могу нарисовать поле со списком в JFileChooser?

Navpreet Kaur 01.11.2018 19:07
but the the list in the combo boxes is distorted. - Понятия не имею, что это значит. То же, что и мой оригинальный комментарий, упростил проблему, выяснив, как это сделать в поле со списком, добавленном на панель, и забыть о JFileChooser. Опубликуйте правильный минимальный воспроизводимый пример, который демонстрирует, как вы пытаетесь настроить поле со списком, чтобы мы могли видеть, в чем проблемы.
camickr 01.11.2018 19:18

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