Как создать поле со списком, заполненным столбцами из объекта? (Джава) - PullRequest
0 голосов
/ 04 июня 2019

У меня есть объект под названием «Книга» со столбцами, такими как заголовок, автор, bookID и т. Д., Созданный на Microsoft SQL Server. Все связано с NetBeans и работает отлично. У меня также есть опция фильтра / поиска, которая также работает хорошо, но я хочу, чтобы поле со списком было заполнено столбцами Книги, такими как заголовок, автор и т. Д., Где я хочу выбрать столбец и выполнять поиск только по ним.

У меня уже есть class с именем BookComboBoxModel, который возвращает книги (код ниже), но мне нужны столбцы книг из этой таблицы, а не метод Book.toString() в comboBox

//this is my book combo model that returns books into combobox

public class BookComboBoxModel extends AbstractListModel<Book> implements ComboBoxModel<Book> {

    private List <Book> data;
    private Book selectedItem;


    public BookComboBoxModel(List<Book> data) {
        this.data = data;
    }

    public BookComboBoxModel() {
    }

    public void add(List<Book> data) {
        this.data = data;
    }

    @Override
    public int getSize() {
        return data.size();
    }

    @Override
    public Book getElementAt(int index) {
        return data.get(index);
    }

    @Override
    public void setSelectedItem(Object anItem) {
        selectedItem = (Book) anItem;
    }

    @Override
    public Object getSelectedItem() {
        return selectedItem;
    }
}

Ответы [ 2 ]

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

Из комментариев видно, что вам нужна не модель объектов Book, а модель, содержащая атрибуты класса Book.

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

public class BookAttribute {
    private final String name;
    private final int columnNumber;

    public BookAttribute(String name,
                         int columnNumber) {

        this.name = Objects.requireNonNull(name, "Name cannot be null");
        this.columnNumber = columnNumber;
    }

    public String getName() {
        return name;
    }

    public int getColumnNumber() {
        return columnNumber;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof BookAttribute) {
            return this.columnNumber == ((BookAttribute) obj).columnNumber;
        }
        return false;
    }

    @Override
    public int hashCode() {
        return Integer.hashCode(columnNumber);
    }

    @Override
    public String toString() {
        return name;
    }
}

С этим классом вам не нужна пользовательская модель. Вы можете просто передать экземпляры непосредственно в стандартный конструктор JComboBox:

TableModel model = table.getModel();

int count = model.getColumnCount();
Vector<BookAttribute> fields = new Vector<>(count);
for (int col = 0; col < count; col++) {
    fields.add(new BookAttribute(model.getColumnName(col), col));
}

JComboBox<BookAttribute> fieldList = new JComboBox<>(fields);

Чтобы использовать его, добавьте фильтр в RowSorter вашего стола:

table.setAutoCreateRowSorter(true);

ActionListener filterUpdater = e -> {
    String searchText = searchField.getText();

    BookAttribute bookAttribute =
        (BookAttribute) fieldList.getSelectedItem();
    int columnNumber = bookAttribute.getColumnNumber();

    TableRowSorter<? extends TableModel> sorter =
        (TableRowSorter<? extends TableModel>) table.getRowSorter();

    sorter.setRowFilter(new RowFilter<TableModel, Integer>() {
        @Override
        public boolean include(
            Entry<? extends TableModel, ? extends Integer> entry) {

            return entry.getStringValue(columnNumber).contains(searchText);
        }
    });
};

searchField.addActionListener(filterUpdater);
fieldList.addActionListener(filterUpdater);

(Вы могли бы использовать отражение для этого, но вы не должны. Отражение ненадежно и подвержено ошибкам, потому что оно не может быть проверено на корректность компилятором. Оно также не может быть оптимизировано Java время выполнения, обычно.)

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

Вы можете создать array объектов (клиентов), а затем передать его combobox следующим образом: combo = new JComboBox(customers);

Взгляните на пример:

import java.awt.BorderLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main extends JFrame {
  JLabel label;
  JComboBox combo;
  public static void main(String args[]) {
    new Main();
  }

  public Main() {
    label = new JLabel("Select a Customer");
    add(label, BorderLayout.NORTH);

    Customer customers[] = new Customer[6];
    customers[0] = new Customer("A", 1);
    customers[1] = new Customer("B", 6);
    customers[2] = new Customer("C", 2);
    customers[3] = new Customer("D", 3);
    customers[4] = new Customer("E", 4);
    customers[5] = new Customer("F", 5);

    combo = new JComboBox(customers);
    combo.addItemListener(e -> {
      Customer c = (Customer) e.getItem();
      label.setText("You selected customer id: " + c.getId());
    });
    JPanel panel = new JPanel();
    panel.add(combo);
    add(panel, BorderLayout.CENTER);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(400, 200);
    setVisible(true);
  }
}

class Customer {
  private String name;
  private int id;

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

  public String toString() {
    return getName();
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...