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

时间:2011-10-17 04:54:13

标签: 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,我得到了我认为是'正常'的JComboBox行为:

  1. 点击文字或箭头,列表会下拉。
  2. 点击所需的项目,进行选择。
  3. 在Linux上,我从Java中获得以下行为:

    1. 点击并按住,列表会下拉。
    2. 发布所需项目,进行选择。
    3. 我也有一些非常奇怪的行为,比如
      • ComboBox本身会在应该存在的窗口中呈现,但是我点击了该列表,从屏幕左上角开始下拉列表,或者
      • 当我点击并按住时,列表会在正确的位置呈现,但我必须将鼠标拖动到左上角才能进行选择,就像列表仍然从那里下降一样。
    4. 进行选择的唯一方法是使用向上/向下箭头键,即使这样,我仍然可以从(0,0)下降列表。
    5. 在Linux上,我从Jython获得以下行为:

      1. 点击并按住,列表会下拉。
      2. 当我向下移动鼠标时,列表项会突出显示,但它们大约有1.5行。即,直到鼠标在第三个项目的中间位置,第二个项目才会突出显示。
      3. 释放鼠标按钮,列表会按原样消失,但原始项目仍然被选中,好像什么都没发生一样。
      4. 同样,正确使用ComboBox的唯一方法是使用键盘,虽然我没有从列表中输入错误的地方获得同样的怪异。
      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)
        

1 个答案:

答案 0 :(得分:0)

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

事实证明,这个问题与SSH,XMing以及为在Linux机器上进行显示转发而设置的任何组合有关。

向任何花时间处理无法回答的问题的人致歉!