Nano Hash - криптовалюты, майнинг, программирование

Цвет раскрывающегося элемента управления и границы в нередактируемом JComboBox

Цвет фона выбранного элемента в нередактируемом JComboBox - своего рода синий:

alt text

Я знаю, что вы можете изменить его на другой цвет, например на белый, с помощью следующий код:

jComboBox1.setRenderer(new DefaultListCellRenderer() {
    @Override
    public void paint(Graphics g) {
        setBackground(Color.WHITE);
        setForeground(Color.BLACK);
        super.paint(g);
    }
});

Это дает вам что-то вроде этого:

alt text

Однако, если вы дважды щелкните это поле со списком, некоторые из них станут серыми (часть с треугольником и рамкой):

alt text

Есть ли способ, чтобы эти части не стали серыми при двойном щелчке по ним?

Обратите внимание, что если вы сначала вызываете super.paint (), все становится темным (включая часть за «Select ...»), так что это не помогает.

29.12.2010

  • что произойдет, если вы сначала вызовете super.paint ()? 29.12.2010
  • Не помогает. Даже хуже. См. Мою правку к вопросу. 29.12.2010
  • SSCCE (sscce.org) лучше, чем изображение. Я не вижу никакой разницы, щелкаете ли вы один или два раза в поле со списком. Стрелка никогда не представляет собой чистый белый фон и никогда не меняется на темно-серый фон. Все, что делает для меня двойной щелчок, - это открытие и закрытие раскрывающегося списка. Я не знаю, почему ваш тестовый код отличается от моего, поэтому не могу предложить никаких предложений. 30.12.2010

Ответы:


1

Пара вещей:

  1. Внешний вид поля со списком (область отображения, стрелка, раскрывающийся список) зависит от LAF. Ваши снимки экрана предполагают WinXP. Если вам необходимо поддерживать какие-либо другие LAF, обязательно проверьте и это, потому что то, что работает для одного LAF, может не работать для другого. Я обнаружил, что это особенно верно для JComboBoxes.

  2. Как предполагает Твистер, изменение цвета путем переопределения метода paint (), вероятно, не лучший способ сделать это. Просто установите цвет фона / переднего плана самого поля со списком. Если вы хотите изменить цвет выпадающего меню (я не понимаю, хотите вы это сделать или нет), добавьте настраиваемое средство визуализации, которое переопределяет getListCellRendererComponent, чтобы установить фон / передний план.

    public static class CustomRenderer extends DefaultListCellRenderer {
    
    @Override
    public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus) {
        super.getListCellRendererComponent(list, value, index, isSelected,
                cellHasFocus);
        setBackground(Color.WHITE);
        setForeground(Color.BLACK);     
        return this;
    }       
    

    }

  3. Серый треугольник и рамка появляются потому, что поле со списком теперь находится в фокусе. Вы можете просто сделать его не фокусируемым, и окраска исчезнет. Однако это может быть не тем поведением, которое вам нужно.

    JComboBox combo = new JComboBox(new Object[]{"Dog", "Cat", "Bird"});
    combo.setBackground(Color.WHITE);
    combo.setForeground(Color.BLACK);
    combo.setFocusable(false);
    
03.02.2011

2

Не уверен, что именно OP пытается достичь, но вот мой рецепт раскраски JComboBox:

static public void main(String[] args) {
    JFrame window = new JFrame("Coloring ComboBox");
    window.setSize(170, 150);
    window.setLocationRelativeTo(null);
    window.setLayout(null);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //---textArea is just for focus switching
    JTextArea textArea = new JTextArea();
    textArea.setBounds(5, 5, 140, 25);
    window.add(textArea);

    UIManager.put("ComboBox.selectionBackground", Color.magenta); //---focused background color
    //---see comboBox's UIDefaults for more tweaks

    JComboBox<String> coloredCombo = new JComboBox<String>(new String[]{"Dog", "Cat", "Bird"});
    coloredCombo.setEditable(false);
    coloredCombo.setUI(new BasicComboBoxUI() {
            @SuppressWarnings({"serial"})
            @Override
            protected ComboPopup createPopup() {
                return new BasicComboPopup(coloredCombo) {
                    {
                        //---style popup anyway you like
                        this.setBorder(BorderFactory.createLineBorder(Color.green, 2));//---popup's border color
                    }
                };
            }
            @Override
            protected JButton createArrowButton() {
                //---style arrow button anyway you like
                JButton result = new JButton();
                result.setBackground(Color.orange);//---button's color
                return result;
            }
        });

    coloredCombo.setBorder(BorderFactory.createLineBorder(Color.red, 2));//---border color
    coloredCombo.setBackground(Color.yellow); //---not focused background color

    coloredCombo.setRenderer(new ListCellRenderer<String>() {
        @Override
        public Component getListCellRendererComponent(JList<? extends String> list, String value, int index,
                boolean isSelected, boolean cellHasFocus) {
            JLabel result = new JLabel(value);
            result.setOpaque(true);
            result.setBackground(isSelected ? Color.cyan : Color.blue); //---item background color
            return result;
        }
    });
    coloredCombo.setBounds(5, 35, 140, 25);
    window.add(coloredCombo);

    window.setVisible(true);
}

Конечно, это всего лишь пример, я рекомендую вам создать необычный пользовательский класс для повторного использования. < img src = "https://i.stack.imgur.com/8ps5R.jpg" alt = "введите описание изображения здесь">

27.09.2018

3

Во-первых, вы не должны устанавливать передний план и фон в методе рисования. Вы должны переопределить getListCellRendererComponent вашего средства визуализации, чтобы настроить его. Средство визуализации по умолчанию меняет свой аспект, если он находится в фокусе или если он выбран. Если вы не хотите, чтобы эти функции были повторно реализованы в методе.

Затем, если вы добавите границу линии в свой рендерер (setBorder (BorderFactory.createLineBorder (Color.black)), вы увидите, что то, что рисуется, не является частью вашего рендерера, а само поле со списком. Поэтому вам, возможно, придется настроить пользовательский интерфейс

10.01.2011

4

Код поворота, который вызывает getListCellRendererComponent, затем вызывает setForeground и setBackground для возвращаемого компонента (в зависимости от того, выбран ли компонент и / или сфокусирован). Я предполагаю, что это из-за какого-то устаревшего поведения. К сожалению, это лишает меня смысла устанавливать его в рендерере.

У меня были хорошие результаты с этим подходом:

Приведенный ниже код позволяет обойти изменение переднего плана и фона, переопределив установщики fg / bg, чтобы они ничего не делали, а затем я просто вызываю супер-реализации, чтобы установить желаемые цвета.

public static class CustomRenderer extends DefaultListCellRenderer {
    public Component getListCellRendererComponent(JList list, Object value,
        int index, boolean isSelected, boolean cellHasFocus) {
        super.getListCellRendererComponent(list, value, index, isSelected,
            cellHasFocus);
        super.setBackground(Color.WHITE);
        super.setForeground(Color.BLACK);     
        return this;
    }
    public void setForeground(Color c) {}
    public void setBackground(Color c) {}
}

Приложение. Серая граница, вероятно, всего лишь граница. Попробуйте тот же подход, но также измените значение setBorder.

02.03.2011
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..