I have an issue about the tray items display in Gnome Shell.
The item icon appears in the lower bar, and I'm fine with that, and just like the other ones, when moving the mouse over the icon, a text is displayed.
My problem is that this text cannot be changed: setting a text with .setText does not work, neither the class support any event, but Selected and MenuDetect, which detect the left and right click, respectively.
Has anybody experienced the same problem?
Thanks a lot in advance for your answers,
Gianluca
Not quite sure what problem you are facing, but this works for me:
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Tray tray = display.getSystemTray();
TrayItem item;
if (tray != null) {
item = new TrayItem(tray, SWT.NONE);
item.setToolTipText("A");
item.setImage(display.getSystemImage(SWT.ICON_ERROR));
}
Button button = new Button(shell, SWT.PUSH);
button.setText("Change tray text");
button.addListener(SWT.Selection, new Listener() {
#Override
public void handleEvent(Event arg0) {
if(tray != null)
{
TrayItem item = tray.getItem(0);
item.setToolTipText(item.getToolTipText() + "A");
}
}
});
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
Note that I don't use setText(), but rather setToolTipText().
Related
I would like to create a dialog window that shows a user's profile (such as name, avatar, sex, etc.) in a visually pleasing way by using labels that contain the relevant information. At the same time, I would like to show an edit button that transforms the labels into textboxes or buttons allowing the name or avatar to be changed.
How can I realize this with SWT? What would be the best strategy to approach this?
You can use a Text and then set setEditable(boolean) to enable/disable editing of the text box from the SWT.Selection Listener of the Button:
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("StackOverflow");
shell.setLayout(new GridLayout(1, false));
// Create a read-only text field
final Text text = new Text(shell, SWT.BORDER);
text.setEditable(false);
text.setText("Some text here");
Button button = new Button(shell, SWT.PUSH);
button.setText("Change");
button.addListener(SWT.Selection, new Listener()
{
#Override
public void handleEvent(Event event)
{
text.setEditable(!text.getEditable());
}
});
shell.open();
shell.pack();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}
Alternatively, you can use a StackLayout and have two versions of the same UI (or just parts of it) and switch between them when the button is pressed.
My program opens a dialog (on a given shell):
new FileDialog(shell).open();
My Question is: How can I (in another part of my program) close all open dialogs of a given
shell?
private void closeDialogs(Shell shell) {
// how to close open dialogs?
}
Below is minimal test case, one button opens the dialogs. The other button should
close all open dialogs of the current shell.
public static void main(final String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("Testcase");
shell.setLayout(new FillLayout());
final Button button = new Button(shell, SWT.PUSH);
button.setText("Open Dialog");
button.addSelectionListener(new SelectionAdapter() {
#Override
public void widgetSelected(final SelectionEvent e) {
new NonModalDialog(shell).open();
}
});
Button button2 = new Button(shell, SWT.PUSH);
button2.setText("Close open dialogs");
button2.addSelectionListener(new SelectionAdapter() {
#Override
public void widgetSelected(SelectionEvent e) {
// How to close all open dialogs of the given shell?
}
});
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
You will have to collect the dialogs in a list as you open them.
When the "close" button is clicked, walk through the list and close the dialogs.
Note: This will not work when any of the dialogs are modal. A modal dialog will take over the event loop and ignore any events that aren't directed at itself, so clicking on the button will be impossible.
I am implementing CTRL+F functionality for a view in my RCP application.( using SWT widgets)
For that, whenever I press CTRL+F, a small text box is popped up for typing and searching in the view.
But, if I dont enter anything or dont focus anything else, it remains popped up.
I want to display it for just 5 seconds of time.
So, please anyone can help?
Thanks in advance!
Adding code for more clarification :-
final Text findTextBox = new Text(viewer.getTable(), SWT.BORDER);
if ((((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'f'))) {
Rectangle rect = viewer.getTable().getBounds();
findTextBox.setVisible(true);
findTextBox.setFocus();
findtextBox.setLocation(rect.x + rect.width -120, rect.y + rect.height - 25);
findTextBox.setSize(120, 25);
}
Here is some code that just utilizes the basic Java libraries and SWT:
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Text text = new Text(shell, SWT.BORDER);
text.setVisible(false);
final Runnable timer = new Runnable()
{
public void run()
{
if (text.isDisposed())
return;
text.setVisible(true);
}
};
display.timerExec(5000, timer);
shell.pack();
shell.setSize(400, 200);
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}
I want to use a text field which will expand when the user enters some data and when the user is done editing and move out of text field than it should collapse. After that when ever user focus on the text field it should expand like a tooltip. Any pointer regarding this will help me.
This code should give you an idea of how to do it:
public static void main(String[] args)
{
Display display = Display.getDefault();
final Shell shell = new Shell(display);
shell.setLayout(new GridLayout(1, false));
final Text text = new Text(shell, SWT.BORDER | SWT.MULTI);
text.setText("edasdasdas\n\nasdasda\n\nasdasd");
final GridData data = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
data.heightHint = 100;
text.setLayoutData(data);
text.addListener(SWT.FocusIn, new Listener()
{
#Override
public void handleEvent(Event arg0)
{
data.heightHint = 100;
shell.layout(true);
}
});
text.addListener(SWT.FocusOut, new Listener()
{
#Override
public void handleEvent(Event arg0)
{
data.heightHint = 50;
shell.layout(true);
}
});
Button button = new Button(shell, SWT.PUSH);
button.setText("Button");
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
It basically changes the heightHint of the GridData when focus is lost/gained. Afterwards you need to re-layout the parent.
You will have to make some adjustments for the "focused height" and "unfocused height" values yourself.
Here are some screenshots:
With focus:
Without focus:
Just press the Button to lose focus.
Just add a FocusListener to your text field:
text.addFocusListener(new FocusListener() {
#Override
public void focusGained(FocusEvent e) {
text.setSize(); // put in the size you want
}
#Override
public void focusLost(FocusEvent e) {
text.setSize(); // put in the size you want
}
});
Note that for setSize to work properly, parent of text can't have a layout.
i am using eclipse rcp and swt for developing application.i have a list and i need to set its visibility false on a movement of title bar or when user click a titleBar. i am unable to find any event of titleBar. Is there any event of titleBar so that i can solve my problem? Or any thing that could probably solve my problem? i searched but could find for flex only as
function panelClick ( event:MouseEvent ) : void
{
trace( event.localX + '/' + event.localY );
}
is there same thing for swt using eclispe.
thanks in advance.
The following code will output "Move" and "Minimize" when the corresponding events happen:
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Button dummy = new Button(shell, SWT.PUSH);
dummy.setText("Dummy");
shell.addListener(SWT.Move, new Listener() {
#Override
public void handleEvent(Event arg0) {
System.out.println("Move");
}
});
shell.addListener(SWT.Iconify, new Listener() {
#Override
public void handleEvent(Event arg0) {
System.out.println("Minimize");
}
});
shell.pack();
shell.setSize(400, 300);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
However, the SWT.MOVE event is only fired after the shell has been moved, i.e. when the "move" is over.