1

我曾尝试在 Jython 的课堂上设置一个按钮。我正在使用 SWT 组件来创建我的 GUI。按钮不出现,但窗口正常出现。我已经在 J​​ava 中创建了这个类,并且运行良好。

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

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

1 回答 1

0

有多个问题:

  1. 的位置self.shell.open()。您在打开外壳create_button()后调用!请参阅 .java 文档。shell.open()
  2. 您正在使用RowLayout,然后创建 a GridData,然后设置 a 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-

在此处输入图像描述

于 2012-06-29T14:59:44.357 回答