Как я могу сделать список комбобокса шире?
import javax.swing.*;
public class test
{
public static void main(String[] args) throws Exception
{
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(120,80);
JComboBox cb = new JComboBox();
cb.addItem("A very long combo-box item that doesn't fit no. 1");
cb.addItem("A very long combo-box item that doesn't fit no. 2");
frame.add(cb);
frame.validate();
frame.setVisible(true);
}
}
Как сделать так, чтобы элементы комбинированного списка отображались так, чтобы весь их текст был виден?
Теперь у меня есть что-то вроде этого:
Я не хочу менять размер комбинированного окна, пока оно свернуто.
Я просто хочу увеличить ширину развернутой части.
6 ответов
Решение
Я думаю, что это может помочь.
Код по ссылке
public class WiderDropDownCombo extends JComboBox {
private String type;
private boolean layingOut = false;
private int widestLengh = 0;
private boolean wide = false;
public WiderDropDownCombo(Object[] objs) {
super(objs);
}
public boolean isWide() {
return wide;
}
// Setting the JComboBox wide
public void setWide(boolean wide) {
this.wide = wide;
widestLengh = getWidestItemWidth();
}
public Dimension getSize() {
Dimension dim = super.getSize();
if (!layingOut && isWide())
dim.width = Math.max(widestLengh, dim.width);
return dim;
}
public int getWidestItemWidth() {
int numOfItems = this.getItemCount();
Font font = this.getFont();
FontMetrics metrics = this.getFontMetrics(font);
int widest = 0;
for (int i = 0; i < numOfItems; i++) {
Object item = this.getItemAt(i);
int lineWidth = metrics.stringWidth(item.toString());
widest = Math.max(widest, lineWidth);
}
return widest + 5;
}
public void doLayout() {
try {
layingOut = true;
super.doLayout();
} finally {
layingOut = false;
}
}
public String getType() {
return type;
}
public void setType(String t) {
type = t;
}
public static void main(String[] args) {
String title = "Combo Test";
JFrame frame = new JFrame(title);
String[] items = {
"I need lot of width to be visible , oh am I visible now",
"I need lot of width to be visible , oh am I visible now" };
WiderDropDownCombo simpleCombo = new WiderDropDownCombo(items);
simpleCombo.setPreferredSize(new Dimension(180, 20));
simpleCombo.setWide(true);
JLabel label = new JLabel("Wider Drop Down Demo");
frame.getContentPane().add(simpleCombo, BorderLayout.NORTH);
frame.getContentPane().add(label, BorderLayout.SOUTH);
int width = 200;
int height = 150;
frame.setSize(width, height);
frame.setVisible(true);
}
}
Более сложный обходной путь - Combo Box Popup от @camickr, реализующий
setScrollBarRequired
- когда true, горизонтальная полоса прокрутки будет автоматически отображаться при необходимостиsetPopupWider
- при значении true ширина всплывающего окна будет зависеть от элементов в поле со списком. Ширина никогда не будет меньше, чем поле со списком.setMaximumWidth
- можете контролировать ширину всплывающего окна на тот случай, если у вас будет неоправданно длинный элемент для рендеринга.setPopupAbove
- когда true, всплывающее окно будет отображаться над полем со списком.- слушая
PopupMenuListener
Вы не используете NetBeans, перетаскивайте. Тогда просто используйте:
JComboBox cb = new JComboBox();
cb.seBounds(10,10,200,30);
Сокращенная версия кода, заданного Pshemo:
import javax.swing.JComboBox;
import java.awt.Dimension;
public class JComboBoxWider extends JComboBox {
private int listWidth=0;
public JComboBoxWider(Object[] objs) {
super(objs);
}
public Dimension getSize() {
Dimension dim = super.getSize();
if (listWidth>0)
dim.width = listWidth;
return dim;
}
public void setListWidth(int listWidth) {
this.listWidth = listWidth;
}
}
Вы создаете JComboBox
объект, но не фиксируя его ширину и длину. После создания объекта JComboBox
использование setBound()
метод. Как это:
JComboBox cb = new JComboBox();
cb.setBounds(10,10,200,30);
Ответ Варрио сработал для меня. Я добавил немного, чтобы сделать общую версию.
import java.awt.Dimension;
import javax.swing.ComboBoxModel;
import javax.swing.JComboBox;
public class JComboBoxWider<E> extends JComboBox<E> {
private static final long serialVersionUID = 1L;
private int listWidth=0;
public JComboBoxWider(ComboBoxModel<E> objs) {
super(objs);
}
public Dimension getSize() {
Dimension dim = super.getSize();
if (listWidth > 0)
dim.width = listWidth;
return dim;
}
public void setListWidth(int listWidth) {
this.listWidth = listWidth;
}
}