JComboBox установочная метка и значение - PullRequest
13 голосов
/ 14 апреля 2011

Можно ли установить значение и метку на JComboBox, чтобы я мог показать метку, но получить значение, которое отличается?

Например, в JavaScript я могу сделать:

document.getElementById("myselect").options[0].value //accesses value attribute of 1st option
document.getElementById("myselect").options[0].text //accesses text of 1st option

Ответы [ 5 ]

27 голосов
/ 14 апреля 2011

Вы можете поместить любой объект в 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;
    }
}
8 голосов
/ 24 мая 2012

Вот интерфейс утилиты и класс, которые позволяют легко получить поле со списком для использования различных меток. Вместо того, чтобы создавать замену 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, которая создает строки на основе языкового стандарта системы, вы можете легко интернационализировать поле со списком без необходимости что-либо изменять в ваших объектах значений.

6 голосов
/ 14 апреля 2011

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

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

enter image description here

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();
            }
        });
    }
}
1 голос
/ 14 апреля 2011

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

0 голосов
/ 07 июня 2019

Шаг 1 Создайте класс с двумя свойствами JComboBox, id, name, например

public class Product {
    private int id;
    private String name;


    public Product(){

    }

    public Product(int id, String name){        
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    //this method return the value to show in the JComboBox
    @Override
    public String toString(){
       return name;
    }

}

Шаг 2 В дизайне формы щелкните правой кнопкой мыши JComboBox и выберите Свойства, откройте вкладку кода и в свойстве Параметры типа введите имя класса, в нашем примере это Product.

enter image description here

Шаг 3 Теперь создайте метод, который подключается к базе данных с помощью запроса для создания списка продуктов, этот метод получает в качестве параметра объект JComboBox.

public void showProducts(JComboBox <Product> comboProduct){
    ResultSet res = null;
    try {
        Connection conn = new Connection();
        String query = "select id, name from products";
        PreparedStatement ps = conn.getConecction().prepareStatement(query);
        res = ps.executeQuery();
        while (res.next()) {
            comboProduct.addItem(new Product(res.getInt("id"), res.getString("name")));
        }
        res.close();
    } catch (SQLException e) {
        System.err.println("Error showing the products " + e.getMessage());
    }

}

Шаг 4 Вы можете вызвать метод из формы

public frm_products() {
    initComponents();

    Product product = new Product(); 

    product.showProducts(this.cbo_product);

}

Теперь вы можете получить доступ к выбранному идентификатору, используя getItemAt метод

System.out.println(cbo_product.getItemAt(this.cbo_product.getSelectedIndex()).getId());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...