当我在另一个函数中运行JPanel.setLocation(x,y)函数时,为什么我的JPanel没有更新?

时间:2013-08-27 03:58:10

标签: python swing jpanel jython repaint

所以我现在已经有一段时间了。我的挥杆技巧也不错,但是现在我似乎错过了一些东西。我最近一直在试验Jython,并且我一直在使用Jython脚本中的swing包。

让我从这开始:我的目标是在JFrame上制作JPanel幻灯片。据我所知,我尝试过这样的尝试:

    x = 0
    while panel.getX() < frame.getWidth():
        print "panel.getX(): %i" % panel.getX()
        panel.setLocation(x,0)
        x += 5
        time.sleep(0.01)

但这是我困惑的主旨......我在我的代码中运行了它,它完全符合我的要求。 JPanel滑过JFrame,我可以看到它这样做:

    from javax.swing import *
    from java.awt import *
    from java.awt.event import *
    import time

    f = JFrame()
    p = JPanel()
    p.setPreferredSize(Dimension(300,300))

    def slide():
        x = 0
        while p.getX() < f.getWidth():
            print "p.getX(): %i" % p.getX()
            p.setLocation(x,0)
            x += 5
            time.sleep(0.5)
    p.add(JLabel("hi"))
    f.getContentPane().add(p)
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
    f.setVisible(True)
    f.pack()
    slide()

但是,当我为事件添加更多复杂性时,它根本没有任何反应。没有更新,重新绘制或任何东西:         来自javax.swing import *         来自java.awt import *         来自java.awt.event import *         进口时间

    f = JFrame()
    p = JPanel()
    p.setPreferredSize(Dimension(300,300))

    def slide(event):
        x = 0
        while p.getX() < f.getWidth():
            print "p.getX(): %i" % p.getX()
            p.setLocation(x,0)
            x += 5
            time.sleep(0.5)
    b = JButton(actionPerformed=slide)
    p.add(JLabel("hi"))
    f.getContentPane().setLayout(BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS))
    f.getContentPane().add(p)
    f.getContentPane().add(b)
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
    f.setVisible(True)
    f.pack()

任何想法???

谢谢,  戴夫

1 个答案:

答案 0 :(得分:0)

循环阻塞事件派发线程,因此不能处理任何事件或绘图。使用摆动Timer进行滑动。该文档适用于java,但希望不难转换为python。