2012-06-28 20 views
1

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

这是我的代码,有什么不好?

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() 

回答

0

有多种问题:

  1. self.shell.open()的位置。你是后开放外壳调用create_button()!见shell.open()的Javadoc。
  2. 您使用RowLayout,然后创建一个GridData,然后设置一个FillLayout。我不会告诉你这个问题。运行代码并查看。

工作实例从您的片段

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