2011-11-25 60 views
2

我使用带有许多条目(数百个)的JComboBox。我想将其下拉列表的大小限制为屏幕的垂直大小。使用固定大小不会对不同的外观&感觉和屏幕分辨率,制定出正确的。如何防止JComboBox下拉列表超出垂直屏幕大小

我使用的Windows 7

的Java 6u25如果我设置的最大行数到超过其适应屏幕上的列表项(=行)数的值(例如100)(75) ,在下拉列表中似乎充满大小进行绘制,但最低的条目是不可见的。

下面是插图的截图(感谢@trashgod的SSCCE)。 sceenshot是在XP上的虚拟机中拍摄的。

enter image description here

我还测试了另一台PC上的代码,所以我想我可以排除一些驱动程序问题。

我喜欢的是一个下拉列表,适合在屏幕上,我可以完全滚动到最后一个值(并看到该值)。反过来,我想看到滚动条的向下滚动按钮。

是否可以在我的计算中呈现列表单元格并将其用于计算?操作组合框的高度参数不起作用。

任何想法如何解决这个问题?

让我感到困惑的是,我没有发现任何关于这个问题的任何参考。我认为我要么缺少明显的东西在这里或我使用了错误的关键字我的搜索。如果后两者中的任何一个,我的道歉请给我一个提示。

谢谢。

+1

在Mac OS X,默认的'com.apple.laf.AquaComboBoxUI'从来没有超过垂直屏幕尺寸,它包括顶部和底部的滚动部件,如需要。您使用了什么[外观和感觉](http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/index.html)? – trashgod

+0

我用相同的结果测试了Windows和Nimbus L&F,虽然Nimbus有更高的行数(对于Windows L&F来说,20 px而不是16),允许60行而不是75,而我的设置中有60行,垂直高度为1200)。但是关于我上面描述的问题,他们的行为是一样的。 – uhm

+2

我觉得这说明很难相信。你可以用[SSCCE](http://sscce.org/)来备份吗? –

回答

7

我觉得这说明很难相信。你可以用SSCCE支持它吗?

你的怀疑是有根据的;我的描述是基于远程实现的遥远的记​​忆。与下面的sscce,我看到一个滚动条,通过@uhm报道截断;我只能通过使用键盘从最后的六个隐藏条目中进行选择。我得到了类似的结果在这些平台上:

 
Mac OS X: [Aqua Look and Feel for Mac OS X - com.apple.laf.AquaLookAndFeel] 
Ubuntu: [The Java(tm) Look and Feel - javax.swing.plaf.metal.MetalLookAndFeel] 
Windows: [The Java(tm) Look and Feel - javax.swing.plaf.metal.MetalLookAndFeel] 
import java.awt.EventQueue; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 

/** @see http://stackoverflow.com/questions/8270256 */ 
public class TallCombo extends JPanel { 

    private static final int N = 128; 

    public TallCombo() { 
     final JComboBox combo = new JComboBox(); 
     for (int i = 0; i < N; i++) { 
      combo.addItem("Item " + Integer.valueOf(i)); 
     } 
     combo.setMaximumRowCount(N/2); 
     this.add(combo); 
    } 

    private void display() { 
     JFrame f = new JFrame("TallCombo"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
     System.out.println(UIManager.getLookAndFeel()); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TallCombo().display(); 
      } 
     }); 
    } 
} 
+0

+1。我不知道方法setMaximumRowCount();为JComboBox。很有用。 –

+1

@Alberto:我以前也没有用过。只要组合是可滚动和可导航的,默认大小似乎是合理的。没有令人信服的理由,我经常对更改用户界面持谨慎态度。 – trashgod

+0

对。我赞同你。例如,当您需要特定的功能或方法时,例如关于JComboBox最大行数的方法,一个令人信服的理由可能就是如此。 ;-) –