问题:我有一个组合框,需要作为Swing应用程序的一部分适合固定的空间。但是,它的内容可能很长。我希望盒子本身是一个固定的大小,截断内容。但是,当单击向下箭头时,我希望它的行为类似于HTML选择,并显示一个足够长的框,以便将最长的条目作为下拉列表。 ListCellRenderer可能是继续这个的方式;我不确定。
也许我需要某种javax.swing.plaf.basic.ComboPopup和我自己的ComboBoxUI的实现。我已经挖掘了SwingUtilities代码,以了解DefaultListCellRenderer如何进行计算。它使用JLabel,而BasicLabelUI调用SwingUtilities.layoutCompoundLabel(最终在调用堆栈中)进行剪切。 BasicComboPopup,我正在挖掘的Java 6代码中唯一的ComboPopup实现,似乎委托给: JList.computeVisibleRect(Component c,Rectangle visibleRect)
以前有人这样做过吗?有什么指针吗?
答案 0 :(得分:1)
答案 1 :(得分:1)
匿名的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);
}
}