动态调整 JComboBox 的宽度以避免在所有情况下出现“...”
Dynamically size the width of a JComboBox to avoid '...' in all scenarios
以下示例将 JComboBox 放置在 Frame 上并加载 5 个项目。
当应用运行s时,显示组合框,看到的是"Long Item..."
在不知道实际激活组合框的情况下,用户不知道哪条记录实际上是可见的。
记住,这实际上是一个动态加载的JComboBox。仅为示例使用硬编码值。因此,最长字符串的长度要到 运行 时间才能获得。
import javax.swing.JComboBox;
import javax.swing.JFrame;
public class JComboBoxTestLength {
JFrame f;
JComboBoxTestLength (){
f=new JFrame("ComboBox Example");
String country[]={"Long Item 5","Long Item 2","Long Item 1","Long Item 8","Long Item 4"};
JComboBox cb=new JComboBox(country);
cb.setBounds(50, 50,90,20);
f.add(cb);
f.setLayout(null);
f.setSize(400,500);
f.setVisible(true);
}
public static void main(String[] args) {
new JComboBoxTestLength ();
}
}
一些线程指示避免使用 setPreferredSize()。
虽然我可以将 setBounds() 值设置得足够长,但希望它看起来美观,并希望根据最长的字符串 + 2 或类似的东西来计算它。
是否可以计算 JComboBox 的宽度以避免看到任何文本出现“...”?
正如 use Layout managers 所评论的那样,以实现所需的布局。
在这种情况下,用使用 FlowLayout
的 JPanel
包装组合可以为您完成工作:
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class JComboBoxTestLength {
JComboBoxTestLength (){
JFrame f=new JFrame("ComboBox Example");
String country[]={"Long Item 5","Long Item 2","Long Item 1","Long Item 8","Long Item 4"};
JComboBox<String> cb=new JComboBox<>(country);
JPanel comboPane = new JPanel(); //uses FlowLayout by default
comboPane.add(cb);
f.add(cb); //JFrame content pane uses BorderLayout by default
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new JComboBoxTestLength ();
}
}
这是一个更完整的示例,它使用 FlowLayout
正确定位和调整 20 个组合框的大小。组合框的宽度仅在初始化时已知,但每个组合框的宽度足以显示它包含的最长字符串。
为了在稍后填充组合时建议大小,为组合提供预期的最长字符串并调用 setPrototypeDisplayValue(E)
,然后在 GUI 打包后设置一个空模型。
这是生成如上所示视图的代码。
import java.awt.*;
import java.util.Random;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class BigComboSize {
private JComponent ui = null;
public final static String INPUT = "Lorem ipsum dolor sit amet, ex mea nostro dictas, duo ludus quando perpetua et. Vis wisi delicata referrentur ex, nec sonet verear molestie eu, commodo impetus ea sit. Mea an audiam debitis similique. No fastidii facilisi democritum est.";
public final static String[] INPUT_ARRAY = INPUT.split(" ");
Random random = new Random();
BigComboSize() {
initUI();
}
public final void initUI() {
if (ui!=null) return;
ui = new JPanel(new BorderLayout(4,4));
ui.setBorder(new EmptyBorder(4,4,4,4));
JPanel comboPanel = new JPanel();
comboPanel.setPreferredSize(new Dimension(800,150));
ui.add(comboPanel);
for (int ii=0; ii<20; ii++) {
String[] strings = {
getRandomString(), getRandomString(), getRandomString()
};
JComboBox<String> combo = new JComboBox<>(strings);
comboPanel.add(combo);
}
JTextArea inputArea = new JTextArea(INPUT, 3, 100);
inputArea.setEnabled(false);
inputArea.setLineWrap(true);
inputArea.setWrapStyleWord(true);
ui.add(new JScrollPane(inputArea), BorderLayout.PAGE_END);
}
private String getRandomString() {
StringBuilder sb = new StringBuilder();
int sttIndex = random.nextInt(INPUT_ARRAY.length-7);
int endIndex = sttIndex + 1 + random.nextInt(6);
for (int ii=sttIndex; ii<endIndex; ii++) {
sb.append(INPUT_ARRAY[ii]);
sb.append(" ");
}
return sb.toString().trim();
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = () -> {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
BigComboSize o = new BigComboSize();
JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
};
SwingUtilities.invokeLater(r);
}
}
以下示例将 JComboBox 放置在 Frame 上并加载 5 个项目。
当应用运行s时,显示组合框,看到的是"Long Item..."
在不知道实际激活组合框的情况下,用户不知道哪条记录实际上是可见的。
记住,这实际上是一个动态加载的JComboBox。仅为示例使用硬编码值。因此,最长字符串的长度要到 运行 时间才能获得。
import javax.swing.JComboBox;
import javax.swing.JFrame;
public class JComboBoxTestLength {
JFrame f;
JComboBoxTestLength (){
f=new JFrame("ComboBox Example");
String country[]={"Long Item 5","Long Item 2","Long Item 1","Long Item 8","Long Item 4"};
JComboBox cb=new JComboBox(country);
cb.setBounds(50, 50,90,20);
f.add(cb);
f.setLayout(null);
f.setSize(400,500);
f.setVisible(true);
}
public static void main(String[] args) {
new JComboBoxTestLength ();
}
}
一些线程指示避免使用 setPreferredSize()。
虽然我可以将 setBounds() 值设置得足够长,但希望它看起来美观,并希望根据最长的字符串 + 2 或类似的东西来计算它。
是否可以计算 JComboBox 的宽度以避免看到任何文本出现“...”?
正如
在这种情况下,用使用 FlowLayout
的 JPanel
包装组合可以为您完成工作:
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class JComboBoxTestLength {
JComboBoxTestLength (){
JFrame f=new JFrame("ComboBox Example");
String country[]={"Long Item 5","Long Item 2","Long Item 1","Long Item 8","Long Item 4"};
JComboBox<String> cb=new JComboBox<>(country);
JPanel comboPane = new JPanel(); //uses FlowLayout by default
comboPane.add(cb);
f.add(cb); //JFrame content pane uses BorderLayout by default
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new JComboBoxTestLength ();
}
}
这是一个更完整的示例,它使用 FlowLayout
正确定位和调整 20 个组合框的大小。组合框的宽度仅在初始化时已知,但每个组合框的宽度足以显示它包含的最长字符串。
为了在稍后填充组合时建议大小,为组合提供预期的最长字符串并调用 setPrototypeDisplayValue(E)
,然后在 GUI 打包后设置一个空模型。
这是生成如上所示视图的代码。
import java.awt.*;
import java.util.Random;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class BigComboSize {
private JComponent ui = null;
public final static String INPUT = "Lorem ipsum dolor sit amet, ex mea nostro dictas, duo ludus quando perpetua et. Vis wisi delicata referrentur ex, nec sonet verear molestie eu, commodo impetus ea sit. Mea an audiam debitis similique. No fastidii facilisi democritum est.";
public final static String[] INPUT_ARRAY = INPUT.split(" ");
Random random = new Random();
BigComboSize() {
initUI();
}
public final void initUI() {
if (ui!=null) return;
ui = new JPanel(new BorderLayout(4,4));
ui.setBorder(new EmptyBorder(4,4,4,4));
JPanel comboPanel = new JPanel();
comboPanel.setPreferredSize(new Dimension(800,150));
ui.add(comboPanel);
for (int ii=0; ii<20; ii++) {
String[] strings = {
getRandomString(), getRandomString(), getRandomString()
};
JComboBox<String> combo = new JComboBox<>(strings);
comboPanel.add(combo);
}
JTextArea inputArea = new JTextArea(INPUT, 3, 100);
inputArea.setEnabled(false);
inputArea.setLineWrap(true);
inputArea.setWrapStyleWord(true);
ui.add(new JScrollPane(inputArea), BorderLayout.PAGE_END);
}
private String getRandomString() {
StringBuilder sb = new StringBuilder();
int sttIndex = random.nextInt(INPUT_ARRAY.length-7);
int endIndex = sttIndex + 1 + random.nextInt(6);
for (int ii=sttIndex; ii<endIndex; ii++) {
sb.append(INPUT_ARRAY[ii]);
sb.append(" ");
}
return sb.toString().trim();
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = () -> {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
BigComboSize o = new BigComboSize();
JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
};
SwingUtilities.invokeLater(r);
}
}