JCombobox корректирует текст на основе true/false

У меня есть JComboBox, который имеет значения No и Yes. Вот как я храню его в базе данных:

jdto.setPlacement("Yes".equals(comboPlace.getSelectedItem()));

затем передайте jdto в мой метод создания. Выбор yes дает значение true. Я изо всех сил пытаюсь работать в обратной логике сейчас.

Я хочу иметь возможность автоматически заполнять поле со списком Yes or No в зависимости от значения true/false из базы данных.

банкомат у меня есть следующее

fieldPlace.setSelectedItem(jdto.getPlacement());

Я пробовал оператор if else со строкой, но не смог этого сделать.

может кто-нибудь продемонстрировать, как этого добиться.

это getPlacement()

public Boolean getPlacement() {
        return placement;
    }

person MooHa    schedule 28.02.2013    source источник


Ответы (3)


  • добавить элемент в DefaultComboBoxModel, может быть автоматически инициализирован из соответствующего массива, реализованного в JComboBox API

  • вы можете использовать setSelectedItem или жестко запрограммировать setSelectedIndex

Например

import java.awt.event.ActionEvent;
import java.util.Vector;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class ComboBoxBooleanModel {

    private javax.swing.Timer timer = null;
    private Vector<Boolean> comboBoxItems;
    private JComboBox box;

    public ComboBoxBooleanModel() {
        comboBoxItems = new Vector<Boolean>();
        comboBoxItems.add(Boolean.TRUE);
        comboBoxItems.add(Boolean.FALSE);
        box = new JComboBox(comboBoxItems);
        JFrame frame = new JFrame("");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(box);
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                box.setSelectedIndex(1);
            }
        });
        start();
    }

    private void start() {
        timer = new javax.swing.Timer(1250, updateCol());
        timer.start();
    }

    public Action updateCol() {
        return new AbstractAction("text load action") {
            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                if (box.getSelectedItem() == (Boolean) false) {
                    box.setSelectedItem((Boolean) true);
                } else {
                    box.setSelectedItem((Boolean) false);
                }
            }
        };
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                ComboBoxBooleanModel comboBoxModel = new ComboBoxBooleanModel();
            }
        });
    }
}
person mKorbel    schedule 28.02.2013

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

 public class BooleanListCellRenderer extends DefaultListCellRenderer {

     public Component getListCellRendererComponent( ... Object value, ...) {
          if (Boolean.TRUE.equals(value) { 
             value = "Yes";
          } else if (Boolean.FALSE.equals(value)) {
             value = "No";
          }
          return super.getListCellRendererComponent(... value....);   
     }
 }
person kleopatra    schedule 28.02.2013
comment
хорошо, но проблема в том, что он всегда возвращается из sqlite как false, несмотря на то, что это правда. мои методы getter и setter являются логическими, а не строковыми - person MooHa; 28.02.2013

Похоже, ваша модель JComboBox содержит экземпляры String, поэтому напишите вспомогательный метод, который переводит:

public String getPlacementString() {
    if (getPlacement()) {
        return "Yes";
    } else {
        return "No";
    }
}

Затем используйте этот метод для setSelectedItem():

fieldPlace.setSelectedItem(jdto.getPlacementString());
person trashgod    schedule 28.02.2013
comment
Привет, я сохраняю его как 'jdto.setPlacement(Yes.equals(fieldPlace.getSelectedItem()));' и он становится истинным, если я нажимаю «да», но на стороне поиска он всегда становится ложным, даже если это правда - person MooHa; 28.02.2013
comment
Вы совершаете транзакцию? Показывает ли база данных обновление? - person trashgod; 28.02.2013
comment
немного разочарован... отображение элементов в визуальное представление - это задача рендерера, а не какого-то вспомогательного метода (кроме случаев, когда последний используется кастомным рендерером :) - person kleopatra; 28.02.2013
comment
@kleopatra: Совершенно верно; это хак/патч. +1 к вашему (лучшему) подходу; enum является хорошей записью комбинированной модели. для примера. - person trashgod; 28.02.2013