按钮不会出现在Jython上的SWT上

时间:2012-06-28 20:19:55

标签: button swt jython

我已经尝试在Jython的课堂上放一个按钮。我正在使用SWT组件来创建我的GUI。该按钮不会出现,但窗口会正常显示。我已经在Java上创建了这个类,并且运行良好。

这是我的代码,出了什么问题?

from java.lang import Thread as JThread, InterruptedException
from org.eclipse.swt import widgets, layout, SWT 
from org.eclipse.swt.layout import GridLayout, GridData, FillLayout
from org.eclipse.swt.widgets import Composite, Listener#, Event
from org.yakindu.sct.runtime.java.new64 import New64CycleBasedStatemachine
import time

class Cycle(object):
    def __init__(self):

        self.display = widgets.Display()
        self.shell = widgets.Shell(self.display, SWT.SHELL_TRIM | SWT.APPLICATION_MODAL)
        self.shell.setLayout(layout.RowLayout())
        self.shell.setText("Message Window")
        self.shell.setLocation(300, 300)
        self.shell.setSize(300, 150)
        self.thread = JThread()
        self.shell.open()

    def run(self):
        self.statemachine = New64CycleBasedStatemachine()
        self.statemachine.enter()
        while not self.thread.isInterrupted():
            self.statemachine.getInterfaceNewTest().getVarMessage()
            self.statemachine.runCycle()
            try: 
                time.sleep(100)
            except InterruptedException: 
                self.thread.interrupt()


        self.thread.start()

    def show_window(self):
        while not self.shell.isDisposed():
            if not self.display.readAndDispatch():
                self.display.sleep()
        self.display.dispose()

        self.thread.interrupted()

    def create_button(self, statemachine, shell):
        self.buttonComposite = Composite(shell, SWT.NO_SCROLL)
        self.buttonCompositeGridData =  GridData()
        self.buttonCompositeGridData.horizontalAlignment = GridData.FILL
        self.buttonCompositeGridData.grabExcessHorizontalSpace = True
        self.buttonComposite.setLayoutData(self.buttonCompositeGridData)
        self.buttonCompositeLayout = FillLayout()
        self.buttonCompositeLayout.type = SWT.HORIZONTAL
        fillLayout = FillLayout()

        self.buttonComposite.setLayout(fillLayout)
        self.button = widgets.Button(self.buttonComposite, SWT.PUSH);
        self.button.setText("Ok")


foo = Cycle()
foo.run()
foo.create_button()
foo.show_window()

1 个答案:

答案 0 :(得分:0)

有很多问题:

  1. self.shell.open()的位置。在打开 shell之后,您正在调用create_button()!请参阅shell.open()
  2. 的javadoc
  3. 您正在使用RowLayout,然后创建GridData,然后设置FillLayout。我不会告诉你这个问题。运行代码并查看。
  4. 从您的代码段中的工作示例

    from java.lang import Thread as JThread, InterruptedException
    from org.eclipse.swt import widgets, layout, SWT 
    from org.eclipse.swt.layout import GridLayout, GridData, FillLayout
    from org.eclipse.swt.widgets import Composite, Listener#, Event
    
    import time
    
    class Cycle(object):
        def __init__(self):
    
            self.display = widgets.Display()
            self.shell = widgets.Shell(self.display, SWT.SHELL_TRIM | SWT.APPLICATION_MODAL)
            self.shell.setLayout(layout.RowLayout())
            self.shell.setText("Message Window")
            self.shell.setLocation(300, 300)
            self.shell.setSize(300, 150)
    
        def show_window(self):
            self.shell.open() // I have moved it here. After all the control creation !!
            while not self.shell.isDisposed():
                if not self.display.readAndDispatch():
                    self.display.sleep()
            self.display.dispose()
    
    
        def create_button(self):
            self.buttonComposite = Composite(self.shell, SWT.NO_SCROLL)
            #self.buttonCompositeGridData =  GridData()
            #self.buttonCompositeGridData.horizontalAlignment = GridData.FILL
            #self.buttonCompositeGridData.grabExcessHorizontalSpace = True
            #self.buttonComposite.setLayoutData(self.buttonCompositeGridData)
            self.buttonCompositeLayout = FillLayout()
            self.buttonCompositeLayout.type = SWT.HORIZONTAL
            fillLayout = FillLayout()
    
            self.buttonComposite.setLayout(fillLayout)
            self.button = widgets.Button(self.buttonComposite, SWT.PUSH);
            self.button.setText("Ok")
    
    
    foo = Cycle()
    foo.create_button()
    foo.show_window()
    

    <强> Output-

    enter image description here