Можно ли вызвать объект из String ComboBox? (JAVA) [дубликат]

Если мы рассмотрим общие сценарии, в которых может быть выбрано это исключение, доступ к свойствам с объектом вверху.

Пример:

string postalcode=Customer.Address.PostalCode; 
//if customer or address is null , this will through exeption

здесь, если адрес имеет значение null, то вы получите NullReferenceException.

Итак, в качестве практики мы всегда должны использовать проверку нуля, прежде чем обращаться к свойствам в таких объектах (особенно в общих)

string postalcode=Customer?.Address?.PostalCode;
//if customer or address is null , this will return null, without through a exception
13
задан xdevel2000 14 April 2011 в 11:02
поделиться

4 ответа

Вы можете поместить любой объект внутри JComboBox. По умолчанию он использует метод toString объекта для отображения метки в поле со списком с помощью клавиатуры. Таким образом, лучший способ - это, вероятно, определить и использовать соответствующие объекты внутри комбо:

public class ComboItem {
    private String value;
    private String label;

    public ComboItem(String value, String label) {
        this.value = value;
        this.label = label;
    }

    public String getValue() {
        return this.value;
    }

    public String getLabel() {
        return this.label;
    }

    @Override
    public String toString() {
        return label;
    }
}
26
ответ дан Hüseyin Yağlı 28 August 2018 в 01:45
поделиться

Используйте ListCellRenderer для достижения желаемого. Создайте класс, который расширяет JLabel и реализует ListCellRenderer. Задайте этот класс как средство рендеринга в вашем JComboBox, используя метод setRenderer(). Теперь, когда вы получаете доступ к значениям из jcombobox, он будет иметь тип jlabel.

1
ответ дан Harry Joy 28 August 2018 в 01:45
поделиться

Вот интерфейс утилиты и класс, которые упрощают получение комбинированного поля для использования разных меток. Вместо того, чтобы создавать замену ListCellRenderer (и рискуя выглядеть неуместно, если внешний вид изменится), это использует значение по умолчанию ListCellRenderer (что бы это ни было), но заменяя ваши собственные строки как текст ярлыка вместо toString() в ваших объектах значения.

public interface ToString {
    public String toString(Object object);
}

public final class ToStringListCellRenderer implements ListCellRenderer {
    private final ListCellRenderer originalRenderer;
    private final ToString toString;

    public ToStringListCellRenderer(final ListCellRenderer originalRenderer,
            final ToString toString) {
        this.originalRenderer = originalRenderer;
        this.toString = toString;
    }

    public Component getListCellRendererComponent(final JList list,
            final Object value, final int index, final boolean isSelected,
            final boolean cellHasFocus) {
        return originalRenderer.getListCellRendererComponent(list,
            toString.toString(value), index, isSelected, cellHasFocus);
    }

}

Как вы видите, ToStringListCellRenderer получает пользовательскую строку из реализации ToString, а затем передает ее оригиналу ListCellRenderer вместо передачи в самом объекте значения.

Чтобы использовать этот код, сделайте что-то вроде следующего:

// Create your combo box as normal, passing in the array of values.
final JComboBox combo = new JComboBox(values);
final ToString toString = new ToString() {
    public String toString(final Object object) {
        final YourValue value = (YourValue) object;
        // Of course you'd make your own label text below.
        return "custom label text " + value.toString();
    }
};
combo.setRenderer(new ToStringListCellRenderer(
        combo.getRenderer(), toString)));

. Как и для создания пользовательских меток, если вы создаете реализацию ToString, которая создает строки, основанные на системе Locale, вы можете легко интернационализировать поле со списком, не изменяя ничего в своих объектах значения.

8
ответ дан MB. 28 August 2018 в 01:45
поделиться

Пожалуйста, можете показать мне полный пример?

Экземпляры Enum особенно удобны для этого, так как toString() "возвращается имя этой константы перечисления, содержащееся в объявлении. "

enter image description here [/g1]

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/questions/5661556 */
public class ColorCombo extends JPanel {

    private Hue hue = Hue.values()[0];

    public ColorCombo() {
        this.setPreferredSize(new Dimension(320, 240));
        this.setBackground(hue.getColor());
        final JComboBox colorBox = new JComboBox();
        for (Hue h : Hue.values()) {
            colorBox.addItem(h);
        }
        colorBox.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Hue h = (Hue) colorBox.getSelectedItem();
                ColorCombo.this.setBackground(h.getColor());
            }
        });
        this.add(colorBox);
    }

    private enum Hue {

        Cyan(Color.cyan), Magenta(Color.magenta), Yellow(Color.yellow),
        Red(Color.red), Green(Color.green), Blue(Color.blue);

        private final Color color;

        private Hue(Color color) {
            this.color = color;
        }

        public Color getColor() {
            return color;
        }
    }

    private static void display() {
        JFrame f = new JFrame("Color");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new ColorCombo());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                display();
            }
        });
    }
}
6
ответ дан trashgod 28 August 2018 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: