为什么根据平台(Windows/Linux)和语言(Java/Jython),我会从JComboBox获得非常不同的行为

为什么根据平台(Windows/Linux)和语言(Java/Jython),我会从JComboBox获得非常不同的行为,java,linux,swing,cross-platform,jython,Java,Linux,Swing,Cross Platform,Jython,我正在编写一个最终将在Linux上运行的Jython应用程序。我在Windows机器上开发,在Linux上测试时,我的行为变得不一致 开发机器-Windows XP、Java 6、Jython 2.5.2 测试机-Red Hat 3.4.3、Java 6、Jython 2.5.2 在Windows中,使用java或jython,我得到了我认为是“正常”的JCOMBOX行为: 单击文本或箭头,列表将下拉 单击所需项目,即可进行选择 在Linux上,我从Java获得以下行为: 单击并按住,列表将

我正在编写一个最终将在Linux上运行的Jython应用程序。我在Windows机器上开发,在Linux上测试时,我的行为变得不一致

  • 开发机器-Windows XP、Java 6、Jython 2.5.2
  • 测试机-Red Hat 3.4.3、Java 6、Jython 2.5.2
在Windows中,使用java或jython,我得到了我认为是“正常”的JCOMBOX行为:

  • 单击文本或箭头,列表将下拉
  • 单击所需项目,即可进行选择
  • 在Linux上,我从Java获得以下行为:

  • 单击并按住,列表将下拉
  • 释放所需项目时,进行选择
  • 我也有一些非常奇怪的行为,比如
    • 组合框本身呈现在窗口中它应该出现的位置,但是我单击,列表从屏幕左上角下拉,或者
    • 当我单击并按住时,列表会呈现在正确的位置,但我必须将鼠标拖动到左上角才能进行选择,就好像列表仍然从那里往下掉一样
  • 进行选择的唯一方法是使用向上/向下箭头键,即使这样,我仍然可以从(0,0)下拉列表
  • 在Linux上,我从Jython获得以下行为:

  • 单击并按住,列表将下拉
  • 当我向下移动鼠标时,列表项会高亮显示,但它们的间隔约为1.5行。也就是说,第二项直到鼠标移到第三项的一半时才会突出显示
  • 释放鼠标按钮,列表将消失,但原始项目仍处于选中状态,就好像什么都没有发生一样
  • 同样,正确使用组合框的唯一方法是使用键盘,尽管我不会因为列表从错误的地方掉下来而感到奇怪
  • 以下是我的Java SSCCE:

    package foo;
    
    import javax.swing.*;
    import java.awt.*;
    
    public class Foo extends JPanel{
        public Foo(){
            super(new BorderLayout());
    
            String[] contents = {"Foo", "Bar", "Baz"};
            JComboBox combo = new JComboBox(contents);
    
            add(combo, BorderLayout.PAGE_START);
        }
    
        private static void BuildAndShow(){
            JFrame mainWindow = new JFrame("Testing");
            mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            //Create and set up the content pane.
            JComponent contentPane = new Foo();
            contentPane.setOpaque(true); //content panes must be opaque
            mainWindow.setContentPane(contentPane);
    
            //Display the window.
            mainWindow.pack();
            mainWindow.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    BuildAndShow();
                }
            });
        }
    }
    
    这是我的Jython SSCCE:

    from java.lang import Runnable
    from javax.swing import SwingUtilities, JFrame, JComboBox
    from java.awt import BorderLayout
    import time
    
    class Foo(Runnable):    
        def run(self):
            mainWindow = JFrame('Test', defaultCloseOperation = JFrame.EXIT_ON_CLOSE)
            mainWindow.setLayout(BorderLayout())
            mainWindow.add(JComboBox(["Foo", "Bar", "Baz"]), BorderLayout.PAGE_START)
            mainWindow.visible = True
    
    if __name__ == "__main__":
        app = Foo()
        SwingUtilities.invokeLater(app)
        while True: 
            time.sleep(5)
    

    在最终实际访问了我一直在远程测试的Linux机器之后,一切正常

    因此,这个问题与SSH、XMing以及在Linux机器上进行显示转发的任何设置的组合有关


    向那些花时间回答这个无法回答的问题的人道歉

    加1表示支持。在Mac OS X 10.5和Ubuntu10.04.3上的工作与预期一样。我应该提到,我的Linux测试是通过SSH完成的,使用的是Xming,仍然在同一台Windows机器上。“我正在努力找出这个多层办公室里的Linux盒子在哪里,这样我就可以坐在那里进行测试了。”安德烈·霍姆普森大叫一声,对代码做了一些编辑,但没有看到那一行。现在试试。好的,我现在就可以编译了。不幸的是,前几周我在安装Win 7 64位时把我的Ubuntu操作系统弄坏了,还没有时间重新安装。Linux上安装的JRE是什么?确保您使用的是Oracle/Sun JRE或OpenJDK 6。避免GCJ。