JComboBox с увеличенной шириной - PullRequest
1 голос
/ 25 августа 2009

Проблема: у меня есть поле со списком, которое должно вписаться в фиксированное пространство как часть приложения Swing. Однако его содержимое может быть довольно длинным. Я бы хотел, чтобы сама коробка была фиксированного размера, с усеченным содержимым. Однако при нажатии на стрелку вниз я бы хотел, чтобы он действовал аналогично выделению HTML и отображал поле, достаточно длинное, чтобы соответствовать самой длинной записи в раскрывающемся списке. ListCellRenderer может быть способом пойти на это; Я не уверен.

Возможно также, что мне нужна какая-то реализация javax.swing.plaf.basic.ComboPopup и моего собственного ComboBoxUI. Я копался в коде SwingUtilities, чтобы понять, как DefaultListCellRenderer выполняет свои вычисления. Он использует JLabel, и BasicLabelUI вызывает SwingUtilities.layoutCompoundLabel (в конечном итоге в стеке вызовов), который выполняет отсечение. BasicComboPopup, единственная реализация ComboPopup в коде Java 6, через которую я копался, казалось, делегировал: JList.computeVisibleRect (Компонент c, прямоугольник visibleRect)

Кто-нибудь делал это раньше? Есть указатели?

Ответы [ 2 ]

1 голос
/ 19 февраля 2012

JComboBox от анонимного с раскрывающимся списком переменной ширины. Обратите внимание, что это только Metal LAF.

import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.plaf.metal.*;
import javax.swing.plaf.basic.*;

/**
 * @version 1.0 12/12/98
 * updated 2012-02-18 to include @Overrides and other Java needs
 */
class SteppedComboBoxUI extends MetalComboBoxUI {
  @SuppressWarnings("serial")
@Override
  protected ComboPopup createPopup() {
    BasicComboPopup popup = new BasicComboPopup( comboBox ) {

      @Override
    public void show() {
        Dimension popupSize = ((SteppedComboBox)comboBox).getPopupSize();
        popupSize.setSize( popupSize.width,
          getPopupHeightForRowCount( comboBox.getMaximumRowCount() ) );
        Rectangle popupBounds = computePopupBounds( 0,
          comboBox.getBounds().height, popupSize.width, popupSize.height);
        scroller.setMaximumSize( popupBounds.getSize() );
        scroller.setPreferredSize( popupBounds.getSize() );
        scroller.setMinimumSize( popupBounds.getSize() );
        list.invalidate();            
        int selectedIndex = comboBox.getSelectedIndex();
        if ( selectedIndex == -1 ) {
          list.clearSelection();
        } else {
          list.setSelectedIndex( selectedIndex );
        }            
        list.ensureIndexIsVisible( list.getSelectedIndex() );
        setLightWeightPopupEnabled( comboBox.isLightWeightPopupEnabled() );

        show( comboBox, popupBounds.x, popupBounds.y );
      }
    };
    popup.getAccessibleContext().setAccessibleParent(comboBox);
    return popup;
  }
}


@SuppressWarnings("serial")
public class SteppedComboBox extends JComboBox {
  protected int popupWidth;

  public SteppedComboBox(ComboBoxModel aModel) {
    super(aModel);
    setUI(new SteppedComboBoxUI());
    popupWidth = 0;
  }

  public SteppedComboBox(final Object[] items) {
    super(items);
    setUI(new SteppedComboBoxUI());
    popupWidth = 0;
  }

  @SuppressWarnings("unchecked")
public SteppedComboBox(Vector items) {
    super(items);
    setUI(new SteppedComboBoxUI());
    popupWidth = 0;
  }


  public void setPopupWidth(int width) {
    popupWidth = width;
  }

  public Dimension getPopupSize() {
    Dimension size = getSize();
    if (popupWidth < 1) popupWidth = size.width;
    return new Dimension(popupWidth, size.height);
  }
}
1 голос
/ 25 августа 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...