2012-04-05 7 views
1

Ich möchte den JFace PopupDialog als leichtgewichtigen Dialog für Benutzereingaben verwenden. Aber ich habe ein paar Probleme mit der Hintergrundfarbe von Text Widgets.Hintergrundfarbe von Widgets in JFace PopupDialog

Wie Sie unten in 1 sehen können, hat ein SWT.MULTI Text Widget keinen Hintergrund und Rahmen, ein SWT.SINGLE Text Widget hat keinen Hintergrund. Ich habe versucht, die Hintergrundfarbe zu überschreiben mit:

Text comment = new Text(composite, SWT.MULTI|SWT.BORDER); 
comment.setFocus(); 
comment.setBackground(new Color(Display.getDefault(), new RGB(000, 000, 000))); 
// method of PopupDialog 
applyBackgroundColor(new Color(Display.getDefault(), new RGB(000, 000, 000)), comment); 

Hat jemand hat, wie eine Idee, diese richtig zu handhaben?

Vielen Dank im Voraus!

Text SWT.Multi on the left, SWT.SINGLE on the right side

EDIT: Wie gewünscht, hier ist die Quelle für das Popup. Ich subclassed die PopupDialog, wie ich das Fenster geöffnet werden neben dem Cursor Standort gesucht:

public class MouseLocationPopupDialog extends PopupDialog { 
private final static int SHELL_STYLE = PopupDialog.INFOPOPUP_SHELLSTYLE; 

public MouseLocationPopupDialog(Shell parent, String infoText) { 
    this(parent, SHELL_STYLE, true, false, false, false, false, null, infoText); 
} 

public MouseLocationPopupDialog(Shell parent, String titleText, String infoText) { 
    this(parent, SHELL_STYLE, true, false, false, false, false, titleText, infoText); 
} 

public MouseLocationPopupDialog(Shell parent, String infoText, final Point size) { 
    this(parent, infoText); 
    getShell().setSize(size); 
} 

public MouseLocationPopupDialog(Shell parent, int shellStyle, boolean takeFocusOnOpen, boolean persistSize, boolean persistLocation, boolean showDialogMenu, boolean showPersistActions, String titleText, String infoText) { 
    super(parent, shellStyle, takeFocusOnOpen, persistSize, persistLocation, showDialogMenu, showPersistActions, titleText, infoText); 
} 

@Override 
protected void adjustBounds() { 
    super.adjustBounds(); 
    Display d = Display.getCurrent(); 
    if (d == null) { 
     d = Display.getDefault(); 
    } 
    Point point = d.getCursorLocation(); 
    getShell().setLocation(point.x + 9, point.y + 14); 
} 
} 

Die tatsächliche Nutzung ist wie folgt:

final PopupDialog dialog = new MouseLocationPopupDialog(HandlerUtil.getActiveShell(event), "Title", "Bottom bar") { 
@Override 
protected Control createDialogArea(Composite parent) { 
    Control composite = super.createDialogArea(parent); 
    Composite table = new Composite((Composite) composite, SWT.NONE); 
    table.setLayout(new GridLayout(2, true)); 
    // text is a member variable 
    text = new Text(table, SWT.SINGLE | SWT.BORDER); 
    Button submit = new Button(table, SWT.PUSH); 
    return composite; 
} 

@Override 
protected Control createContents(Composite parent) { 
    Control contents = super.createContents(parent); 

    final Color backgroundColor = new Color(Display.getCurrent(), new RGB(255, 255, 255)); 
    text.setBackground(backgroundColor); 
    final Color foregroundColor = new Color(Display.getCurrent(), new RGB(0,0,0)); 
    text.setForeground(foregroundColor); 
    backgroundColor.dispose(); 
    foregroundColor.dispose(); 

    return contents; 
} 
}; 
dialog.open(); 

Beachten Sie, dass diese Popup von anderen UI-Elementen unabhängig ist : der Code wird nicht für den Abschluss der Popups open() wie andere JFace Dialoge (zB TitleAreaDialog)

+0

Gerade versucht dies auf Eclipse Indigo auf Windows 7 (ohne applyBackground, nur comment.setBackground) und Textfeld zeigte eine schwarze Hintergrund. Welches Betriebssystem verwenden Sie? Vergiss auch nicht, Farbobjekte zu entsorgen, wenn du damit fertig bist. –

+0

Ich benutze OSX. Ich werde es mit Windows und Linux versuchen. –

+0

nur offtopic: können Sie den gesamten Code posten? Ich bin an einem Dialog wie diesem interessiert –

Antwort

2

Zunächst einmal verwenden SWT.BORDER statt SWT.BORDER_SOLID warten. Wenn Sie Glück haben, verursacht dies Ihr Problem. Abgesehen davon ist es schwierig, aus Ihrem kleinen Ausschnitt allein zu sehen, was schief läuft. Wenn es keinen anderen Code gibt, der später die Hintergrundfarbe zurücksetzt, sollte dies funktionieren.

aktualisieren: Versuchen Sie, die Methode getBackground() von PopupDialog und lassen Sie es zurückgeben Sie die gewünschte Farbe zu überschreiben. Ihr Code ist wahrscheinlich in createDialogArea(..) und PopupDialog gilt diese Farbe im Grunde alles nach Ihren Code. Wenn Sie nur die Hintergrundfarbe von spezifischen Kontrollen ändern möchten, können Sie Folgendes versuchen:

@Override 
protected Control createContents(Composite parent) { 
    Composite contents = super.createContents(parent); 

    // set the color here 

    return contents; 
} 
+0

Das ist mein Problem - danach gibt es keinen anderen Code mehr. Wie oben erwähnt, scheint es mit Indigo und Windows 7 zu funktionieren. Aber eine gute Nachricht: border wird mit 'SWT.BORDER' angezeigt. –

+0

Siehe das Update zu meiner Antwort. – p12t

+0

Es funktioniert, wenn das Textfeld eine Membervariable ist und - wie oben vorgeschlagen - setze ich die Hintergrundfarbe in createContents –