SWT - 如何更改窗口类名称? WM_CLASS

时间:2017-07-13 18:00:18

标签: java swt

目前我所有的Java GUI应用程序都有SWT.SWT作为它们的窗口类。我想将其中一些链接作为菜单应用程序(如Cairo-Dock)中的子窗口。这是wmctrl -lx输出的第三列。

我尝试使用Display.setAppName()方法尝试设置此名称。 Display.setAppNamedisplay.SetAppname都不会将应用类从SWT.SWT更改为我要设置的班级名称。

当我使用小写display.setAppName时,它会在Eclipse IDE中生成此警告:

Description Resource    Path    Location    Type
The static method setAppName(String) from the type Display should be accessed in a static way   WBTest.java /javaTools/src/javaTools    line 31 Java Problem

代码示例:

package javaTools;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.wb.swt.SWTResourceManager;

public class WBTest {
    private Table table;

    /**
     * Launch the application.
     * @param args
     */
    public static void main(String[] args) {
        try {
            WBTest window = new WBTest();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Open the window.
     */
    public void open() {
        Display display = Display.getDefault();
        display.setAppName("myapplication");
        Shell shell = new Shell();
        shell.setBackground(SWTResourceManager.getColor(SWT.COLOR_BLACK));
        shell.setSize(560, 426);
        shell.setText("SWT Application");

        table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
        table.setBackground(SWTResourceManager.getColor(SWT.COLOR_BLUE));
        // table.setBounds(49, 21, 241, 158);
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        TableItem row = new TableItem(table, SWT.NONE);
        row.setText("This is a test.");


        shell.open();
        // shell.layout();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }
}

我的研究显示如何在 Python 中执行此操作,该工作正常:

#!/usr/bin/python
from gi.repository import Gtk

win = Gtk.Window()
win.connect("delete-event", Gtk.main_quit)
win.set_wmclass ("Hello World", "Hello World")
win.set_title ("Hello World")
win.show_all()
Gtk.main()

我试图用 SWT / Java 做同样的事情。 是否还需要添加其他功能才能使其正常工作,或者是否存在特定于设置应用程序类名的不同功能?

1 个答案:

答案 0 :(得分:0)

我不知道是要删除这个问题还是提供答案。我从昨天起就开始研究它,但仍然在尝试很多变化。

一个人终于有效了。显然,在声明Display之前,该行必须出现在代码中。

这有效:

package javaTools;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.wb.swt.SWTResourceManager;

public class WBTest {
    private Table table;

    /**
     * Launch the application.
     * @param args
     */
    public static void main(String[] args) {
        try {
            WBTest window = new WBTest();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Open the window.
     */
    public void open() {
        Display.setAppName("myapplication");
        Display display = Display.getDefault();
        Display.setAppName("myapplication");
        Shell shell = new Shell();
        shell.setBackground(SWTResourceManager.getColor(SWT.COLOR_BLACK));
        shell.setSize(560, 426);
        shell.setText("SWT Application");

        table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
        table.setBackground(SWTResourceManager.getColor(SWT.COLOR_BLUE));
        // table.setBounds(49, 21, 241, 158);
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        TableItem row = new TableItem(table, SWT.NONE);
        row.setText("This is a test.");


        shell.open();
        // shell.layout();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }
}