java - Windows 7 似乎破坏了 SWT Control.print(GC)

标签 java eclipse swt

一个错误已在 SWT 中提交并修复(非常快): https://bugs.eclipse.org/bugs/show_bug.cgi?id=305294

作为序言,我的目标是将两个图像打印到 Canvas 中,以便我可以为 Canvas 在屏幕上滑动设置动画(想想 iPhone),滑动控件本身太占用 CPU 资源,所以在我在 Win7 上进行测试之前,这是一个很好的替代方案。我愿意接受任何能帮助我解决原来问题的事情,但不一定要解决下面的问题。

有谁知道如何让“Control.print(GC)”与 Windows 7 Aero 配合使用?当 Aero 被禁用时,我的代码在 Windows XP 和 Windows 7 中运行得很好,但是命令:

control.print(GC) 导致非顶部控件被有效地从屏幕上删除。

GC gc = new GC(image);
try {
    // As soon as this code is called, calling "layout" on the controls
    // causes them to disappear.
    control.print(gc);
} finally {
    gc.dispose();
}

我有堆叠的控件,并且想打印当前和下一个控件的图像,以便我可以将它们“滑”出屏幕。但是,在打印非顶部控件时,它不会再次重绘。

这是一些示例代码。 (有趣的代码位位于顶部,需要指向 SWT 才能工作。)

感谢您的所有帮助。作为解决方法,我正在考虑在打印之间交换控件,看看这是否有帮助,但我宁愿不这样做。

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

public class SWTImagePrintTest {
    private Composite stack;
    private StackLayout layout;
    private Label lblFlip;
    private Label lblFlop;
    private boolean flip = true;
    private Button buttonFlop;
    private Button buttonPrint;

    /**
     * Prints the control into an image
     * 
     * @param control
     */
    protected void print(Control control) {
        Image image = new Image(control.getDisplay(), control.getBounds());
        GC gc = new GC(image);
        try {
            // As soon as this code is called, calling "layout" on the controls
            // causes them to disappear.
            control.print(gc);
        } finally {
            gc.dispose();
        }
    }

    /**
     * Swaps the controls in the stack
     */
    private void flipFlop() {
        if (flip) {
            flip = false;
            layout.topControl = lblFlop;
            buttonFlop.setText("flop");
            stack.layout();
        } else {
            flip = true;
            layout.topControl = lblFlip;
            buttonFlop.setText("flip");
            stack.layout();
        }
    }

    private void createContents(Shell shell) {
        shell.setLayout(new GridLayout(2, true));
        stack = new Composite(shell, SWT.NONE);
        GridData gdStack = new GridData(GridData.FILL_BOTH);
        gdStack.horizontalSpan = 2;
        stack.setLayoutData(gdStack);
        layout = new StackLayout();
        stack.setLayout(layout);
        lblFlip = new Label(stack, SWT.BOLD);
        lblFlip.setBackground(Display.getCurrent().getSystemColor(
                SWT.COLOR_CYAN));
        lblFlip.setText("FlIp");
        lblFlop = new Label(stack, SWT.NONE);
        lblFlop.setBackground(Display.getCurrent().getSystemColor(
                SWT.COLOR_BLUE));
        lblFlop.setText("fLoP");
        layout.topControl = lblFlip;
        stack.layout();
        buttonFlop = new Button(shell, SWT.FLAT);
        buttonFlop.setText("Flip");
        GridData gdFlip = new GridData();
        gdFlip.horizontalAlignment = SWT.RIGHT;
        buttonFlop.setLayoutData(gdFlip);
        buttonFlop.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                flipFlop();
            }

        });
        buttonPrint = new Button(shell, SWT.FLAT);
        buttonPrint.setText("Print");
        GridData gdPrint = new GridData();
        gdPrint.horizontalAlignment = SWT.LEFT;
        buttonPrint.setLayoutData(gdPrint);
        buttonPrint.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                print(lblFlip);
                print(lblFlop);
            }
        });

    }


    /**
     * @param args
     */
    public static void main(String[] args) {
        Shell shell = new Shell();
        shell.setText("Slider Test");
        shell.setSize(new Point(800, 600));
        shell.setLayout(new GridLayout());
        SWTImagePrintTest tt = new SWTImagePrintTest();
        tt.createContents(shell);
        shell.open();
        Display display = Display.getDefault();
        while (shell.isDisposed() == false) {
            if (display.readAndDispatch() == false) {
                display.sleep();
            }
        }
        display.dispose();
    }
}

最佳答案

这是一个错误的结果: https://bugs.eclipse.org/bugs/show_bug.cgi?id=305294

此问题现已修复。希望SWT的新打包版本很快就会出来,这样我们就可以正式使用它了。

关于java - Windows 7 似乎破坏了 SWT Control.print(GC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2415501/

相关文章:

java - JButton 不更改字段值

java - 桌面程序与服务器通信

java - 为什么 Windows 7 中 SWT 表的列之间有空格

java - 从java中的图像列表制作幻灯片?

java - SWT RowLayout 的最后一个元素占用了多余的水平空间?

java - 在 Linux Box 上获取 JVM 时区

java - 如何混淆 ProGuard 中的库 jar?

Java eclipse : How to add browse button for Table editable cell?

java - 将类重定向到 Eclipse 中的远程位置

java - 为什么 Eclipse 将/jre 添加到我的 JAVA_HOME