Как избавиться от уродливых полосок SWT в Windows 7? - PullRequest
2 голосов
/ 16 февраля 2012

Я поддерживаю SWT / JFace приложение, которое должно работать в Windows XP , а также Windows 7 .Приложение имеет TabFolder, которое содержит Composite, которое, в свою очередь, содержит виджеты.Ничего необычного, и все работает хорошо, за исключением ...


Кнопки

Хотя в Windows XP они выглядят нормально, в Windows 7 они имеют уродливую серую рамку.*enter image description here enter image description here


enter image description here

Я мог установить фон кнопки вручную, но мне не удалось найти способ выяснить фактический цвет фона родителей,getBackground() всегда возвращает 240, 240, 240, даже если фон на самом деле белый.

Я обнаружил, что в Windows XP фон TabFolder имеет цвет темы 3D-объекты в то время как вВ Windows 7 такой переписки нет.Я пытался установить для каждой отдельной темы ярко-красный, но цвет фона TabFolder не был впечатлен.

Поэтому кнопки SWT сами не устанавливают свой цвет фона правильно, и я не вижу способа найти правильный цвет программно,Что мне делать?


В любом случае, вот код для полного минимального примера для воспроизведения проблемы:

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;

public class TabTest {
    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);

        TabFolder tabFolder = new TabFolder (shell, SWT.NONE);
        TabItem item = new TabItem (tabFolder, SWT.NULL);
        item.setText ("Tab Item");

        Composite comp = new Composite(tabFolder, SWT.NONE);
        comp.setLayout(new RowLayout());
        item.setControl(comp);

        Button button = new Button(comp, SWT.PUSH);
        button.setText("Button ");
        tabFolder.setSize (160, 100);

        //Event Loop
        shell.pack ();
        shell.open ();
        while (!shell.isDisposed()) {
         if (!display.readAndDispatch())
          display.sleep();
        }
        display.dispose();
    }
}

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Это больше похоже на проблему с платформой, чем на проблему SWT.Хотя это и не связано, но была ошибка платформы для setBackground() из TabFolder, она может или не может быть связана с вашей текущей проблемой.

One Обходной путь должен использовать CTabFolder.Смотрите приведенный ниже фрагмент и вывод:

Output on Windows 7, using JDK 1.6_b30, Eclipse 3.7

enter image description here

Code:

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;

public class TabTest 
{
    public static void main(String[] args) 
    {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new GridLayout());
        shell.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        CTabFolder tabFolder = new CTabFolder (shell, SWT.BORDER|SWT.FLAT);
        tabFolder.setLayout(new GridLayout());
        tabFolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        CTabItem item = new CTabItem(tabFolder, SWT.NULL);
        item.setText ("Tab Item");

        Composite comp = new Composite(tabFolder, SWT.NONE);
        comp.setLayout(new GridLayout());
        comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        item.setControl(comp);

        Button button = new Button(comp, SWT.PUSH);
        button.setText("Button ");
        tabFolder.setSize (160, 100);

        item = new CTabItem(tabFolder, SWT.NULL);
        item.setText ("Tab Item");

        //Event Loop
        shell.pack ();
        shell.open ();
        while (!shell.isDisposed()) {
         if (!display.readAndDispatch())
          display.sleep();
        }
        display.dispose();
    }
}
1 голос
/ 06 марта 2012

В вашем композите, который удерживает кнопку, установите фоновый режим на SWT.INHERIT_FORCE

    comp.setBackgroundMode(SWT.INHERIT_FORCE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...