Как я могу изменить ширину выпадающего списка JComboBox?

В Swift 4 регистр enum с ассоциированным значением Void больше не эквивалентен регистру enum с пустым списком ассоциированных значений.

Я полагаю, что это, как говорит Мартин , результат SE-0029 , где вы больше не можете передавать кортеж аргументов в функцию и заставлять их «разбрызгиваться» параметры (хотя предложение было помечено как реализованное в Swift 3, я считаю, что этот конкретный случай был раскрыт позже при реализации SE-0110 для Swift 4).

В результате это означает, что вы больше не можете называть (Void) -> T как () -> T в Swift 4. Теперь вам нужно явно передать Void:

let result = Result.success(())

Однако, я мне это кажется довольно уродливым, поэтому я обычно реализую расширение вроде этого:

extension Result where T == Void {
    static var success: Result {
        return .success(())
    }
}

, которое позволяет вам говорить такие вещи:

var result = Result.success
result = .success

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

struct Foo {
  func bar(_ a: T) {}
}

extension Foo where T == Void {
  func bar() { bar(()) }
}

let f = Foo()

// without extension:
f.bar(())

// with extension:
f.bar()

27
задан Daniel Rikowski 5 June 2009 в 14:06
поделиться

3 ответа

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

Если вам просто нужно что-то быстрое и грязное, я нашел способ использовать детали реализации для этого ( здесь ):

public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
    JComboBox box = (JComboBox) e.getSource();
    Object comp = box.getUI().getAccessibleChild(box, 0);
    if (!(comp instanceof JPopupMenu)) return;
    JComponent scrollPane = (JComponent) ((JPopupMenu) comp).getComponent(0);
    Dimension size = new Dimension();
    size.width = box.getPreferredSize().width;
    size.height = scrollPane.getPreferredSize().height;
    scrollPane.setPreferredSize(size);
    //  following line for Tiger
    // scrollPane.setMaximumSize(size);
}

Поместите это в PopupMenuListener и это может работать на вас.

Или вы можете использовать код из первой связанной ошибки :

class StyledComboBoxUI extends BasicComboBoxUI {
  protected ComboPopup createPopup() {
    BasicComboPopup popup = new BasicComboPopup(comboBox) {
      @Override
      protected Rectangle computePopupBounds(int px,int py,int pw,int ph) {
        return super.computePopupBounds(
            px,py,Math.max(comboBox.getPreferredSize().width,pw),ph
        );
      }
    };
    popup.getAccessibleContext().setAccessibleParent(comboBox);
    return popup;
  }
}

class StyledComboBox extends JComboBox {
  public StyledComboBox() {
    setUI(new StyledComboBoxUI());
  }
}
14
ответ дан 28 November 2019 в 05:37
поделиться
16
ответ дан 18 July 2019 в 09:45
поделиться

Похоже, вам нужно написать свой собственный ComboBoxUI .

Здесь есть хороший пример , , который показывает, как это сделать.

Также обратите внимание, метод, который вас, вероятно, заинтересует, - это метод createPopup () . Это метод, который создает всплывающее окно для поля со списком, где вы можете настроить его.

1
ответ дан 28 November 2019 в 05:37
поделиться
Другие вопросы по тегам:

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