SWT ToolBar Buttons mit Text und Bild

Status
Nicht offen für weitere Antworten.

Sakura

Mitglied
Hi zusammen.

Ich lerne grade für die Schule SWT und habe mir dafür das "SWT: A Developer's Notebook" gekauft.

Nun mache ich das Kapitel ToolBars und versuche eine ToolItem mit sowohl Text als auch Bild anzulegen, der Code ist einfach aus dem Buch übernommen.
Java:
        ToolBar bar = new ToolBar(s, SWT.HORIZONTAL);
        bar.setSize(500, 30);
        bar.setLocation(0, 0);

Image childIco = new Image(d, "C:\\Dokumente und Einstellungen\\cadelt\\Eigene Dateien\\Eigene Bilder\\Basic_set_Win\\document.ico");
        ToolItem child = new ToolItem(bar, SWT.PUSH);
        child.setImage(childIco);
        child.setText("Open Child");

Nur bekomme ich in dem Fall gar kein Button. Wenn ich entweder den Text oder das Bild rausnehme bekomme ich einen entsprechenden Button, nur beides zusammen geht nicht.

Ich habe da im Netz auch nichts dazu gefunden, bei den meisten scheint es zu gehen.
Es wäre echt nett, wenn jemand eine Idee hat, warum das nun bei mir nicht geht. 😳

Edit: Ich hab noch etwas experimentiert, und ich kann auch nicht mehrere ToolItems mischen. Wenn ich ein Item mit Text und eines mit Bild habe, wird die ToolBar auch gar nicht dargestellt.
Gleiches gilt wenn ich ein Item mit Bild oder Text habe und ein weiteres mit beidem...
 
Zuletzt bearbeitet:
Hi,

dir fehlt bestimmt sowas
Java:
        ActionContributionItem item = new ActionContributionItem(actionHome);
        item.setMode(ActionContributionItem.MODE_FORCE_TEXT);

Hier mal ein bsp.
Java:
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Decorations;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;

public class TestToolBar {

    Display display = new Display();
    Shell shell = new Shell(display);

    public TestToolBar() {
        MenuManager menuManager = new MenuManager();

        ToolBar toolBar = new ToolBar(shell, SWT.FLAT | SWT.RIGHT);
        final ToolBarManager manager = new ToolBarManager(toolBar);

        // Adds tool bar items using actions.
        // final Action actionForward =
        // new Action(
        // "&Forward",
        // ImageDescriptor.createFromFile(
        // null,
        // "icons/web/forward.gif")) {
        // public void run() {
        // System.out.println("FORWARD");
        // }
        // };
        // actionForward.setAccelerator(SWT.CTRL + 'F');

        Action actionHome = new Action("&Home", ImageDescriptor.createFromFile(null, "eclipse.gif")) {

            public void run() {
                System.out.println("HOME");
            }
        };
        actionHome.setAccelerator(SWT.CTRL + 'H');

        // manager.add(actionForward);

        ActionContributionItem item = new ActionContributionItem(actionHome);
        item.setMode(ActionContributionItem.MODE_FORCE_TEXT);
        manager.add(item);

        manager.update(true);
        toolBar.pack();

        MenuManager fileMenuManager = new MenuManager("&File");
        // fileMenuManager.add(actionForward);
        fileMenuManager.add(actionHome);
        menuManager.add(fileMenuManager);
        menuManager.updateAll(true);
        shell.setMenuBar(menuManager.createMenuBar((Decorations) shell));

        shell.pack();
        shell.open();
        // textUser.forceFocus();

        // Set up the event loop.
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                // If no more entries in event queue
                display.sleep();
            }
        }

        display.dispose();
    }


    public static void main(String[] args) {
        new TestToolBar();
    }
}

Solche SWT Bsp findest du hier

SWT JFace EclipseJava

Aber ich bin mir sicher mit Toolbar SWT und google hättest du das auch geschafft 😉

EDIT: ich weiß nicht ob SWT ico unterstützt...
 
Hm, das macht das Ganze aber ziemlich kompliziert und im Buch steht das mit keinem Wort drin. Schon komisch, ich fand O'Reilly immer verdammt gut. Aber falscher Code in einem Lehrbuch geht gar nicht. :noe:
Dann werd ich mir mal JFace runterladen müssen und mich da mal reinwuseln.

Und ich habe durchaus google benutzt, aber nur einen Blogeintrag von vor 5 Jahren gefunden, der das Problem angesprochen hat. Ich bin davon ausgegangen, dass der schon massiv veraltet wäre...
 
Vielleichts gehts auch anders keine Ahnung, aber ich würde SWT immer mit JFace zusammen benutzen... Ist doch viel komfortabler...
 
Wir machen in der Schule erstmal nur SWT. Alleine das wir unseren Lehrer maßlos überfordern, also komme ich ihm lieber nicht noch mit JFace.

Dieser Beispielcode ist dann ja auch wieder was ganz anderes, als was ich da im Buch stehen habe, mit neuem Actionlistener und allem... Geht zwar, aber dann müsste ich wieder alles wieder umschreiben, und könnte es in der Schule trotzdem nicht nutzen.

Wenn also jemand eine Lösung nur mit SWT hat wäre ich doch sehr verbunden.
 
dann halt nur SWT

Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;

public class TestToolBar {

  public static void main(String[] args) {
    Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setSize(300, 200);
    shell.setText("Toolbar Example");

    ToolBar toolbar = new ToolBar(shell, SWT.FLAT);
    toolbar.setBounds(0, 0, 200, 70);

    ToolItem toolItem1 = new ToolItem(toolbar, SWT.PUSH);
    toolItem1.setText("Save");
    toolItem1.setImage(new Image(null, "eclipse.gif"));
    ToolItem toolItem2 = new ToolItem(toolbar, SWT.PUSH);
    toolItem2.setText("Save As");
    ToolItem toolItem3 = new ToolItem(toolbar, SWT.PUSH);
    toolItem3.setText("Print");
    ToolItem toolItem4 = new ToolItem(toolbar, SWT.PUSH);
    toolItem4.setText("Run");
    ToolItem toolItem5 = new ToolItem(toolbar, SWT.PUSH);
    toolItem5.setText("Help");

    final Text text = new Text(shell, SWT.BORDER);
    text.setBounds(55, 80, 200, 25);

    Listener toolbarListener = new Listener() {
      public void handleEvent(Event event) {
        ToolItem toolItem = (ToolItem) event.widget;
        String caption = toolItem.getText();
        text.setText("You clicked " + caption);
      }
    };

    toolItem1.addListener(SWT.Selection, toolbarListener);
    toolItem2.addListener(SWT.Selection, toolbarListener);
    toolItem3.addListener(SWT.Selection, toolbarListener);
    toolItem4.addListener(SWT.Selection, toolbarListener);
    toolItem5.addListener(SWT.Selection, toolbarListener);

    shell.open();

    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    display.dispose();
  }
}
 
Hallo,
das Beispiel von SirWayne ist sicherlich gut.
Was mich allerdings noch etwas plagt, dass es bei mir in diesem und in allen anderen Snippets actions werden nicht durch Tastenkombinationen ausgelöst. Per Mausklick ja -Tasten nicht.
Wenn ich aber mit MenuItem so was schreibe
Java:
saveItem.setAccelerator (SWT.F4);
funktioniert anstandslos.
Weiss jemand vielleicht was da nicht stimmt?
 
Java:
    MenuItem test = new MenuItem(fileMenu, SWT.CASCADE);
    test.setAccelerator(SWT.CTRL + 'T');
    test.setText("Test");
 
ich meinte dein Beispiel mit Action. Bei mir funktioniert nicht Auslösung per Tastatur.
mit MenuItems, wie in zweitem Beispiel, wird auf Tastatur reagiert.
 
Weiß nicht was du meinst aber sowas funktioniert bei mir wunderbar
Java:
package hnj;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;


public class Test extends ApplicationWindow {


	public Test(Shell parentShell) {
		super(parentShell);
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) {
		Display display = new Display();
		Shell aShell = new Shell(display);
		Test application = new Test(aShell);
		application.createComponents();
		application.open();
	}

	public void createComponents() {
		
		addMenuBar();
		createMenuBar();
		setBlockOnOpen(true);

	};

	private void createMenuBar() {
		getMenuBarManager().add(createHelpMenu());
	}

	private MenuManager createHelpMenu() {
		MenuManager menu = new MenuManager("Help", "Id01");
		Action action = new Action("test") {
			@Override
			public void run() {
				System.out.println("Test");
			}
		};
		menu.add(action);
		action.setAccelerator(SWT.CTRL + 'T');
		return menu;
	}

	protected Point getInitialSize() {
		return new Point(600, 400);
	}

	protected Point getInitialLocation() {
		return new Point(600, 400);
	}

	
}
 
OK,
jetzt geht es.
Vermutlich liegt es an einem aber feinem Unterschied. Nämlich:
das erste Beispiel ist reines SWT Programm, das dritte ist ein JFace :toll:
Java:
public class Test extends ApplicationWindow
Das erste Beispiel hab ich auf zwei Systemen getestet: XP und Win7, dazu Eclipse 3.5.2 und 3.6 keine Reaktion auf Tastatureingaben.
Danke dir für deine Mühe.
 
Zuletzt bearbeitet:
Wie willst du auch in reinem SWT eine JFace Action in eine Menü reinbekommen? Das geht gar nicht!!!
Außerdem steht doch in der Doku dass du glaub immer SWT.ALT oder CTRL o.ä benutzen musst
 
Wie willst du auch in reinem SWT eine JFace Action in eine Menü reinbekommen? Das geht gar nicht!!!
So wie es in deinem Bsp steht. Denke ich
Außerdem steht doch in der Doku dass du glaub immer SWT.ALT oder CTRL o.ä benutzen musst
jetzt stehe ich auf dem Schlauch.
Java:
public class Test extends ApplicationWindow{

...
private void createActionTest(String titel) {
		actionTest = new Action("test") {
			@Override
			public void run() {
				System.out.println("Test 0");
			}
		};;
		actionTest.setImageDescriptor(ImageDescriptor.createFromFile(null,"3floppy_mount.png"));
		actionTest.setId("test0");
	}

	private void createActionTest1(String titel) {
		actionTest1 = new Action("test 1") {
			@Override
			public void run() {
				System.out.println("Test 1");
			}
		};;
		actionTest1.setImageDescriptor(ImageDescriptor.createFromFile(null,"folder_yellow.png"));
		actionTest1.setId("test1");
	}

	private MenuManager createHelpMenu() {
		MenuManager menu = new MenuManager("Help", "Id01");
		createActionTest("test");
		createActionTest1("test 1");
		actionTest.setAccelerator(SWT.CTRL + 'T');
		actionTest1.setAccelerator(SWT.F4);
		menu.add(actionTest);
		menu.add(actionTest1);
		return menu;
	}

...
}
dein letzter Bsp., ein wenig modifiziert, lässt per F4 ein Action aufrufen.

Sets the accelerator keycode that this action maps to. This is a bitwise OR of zero or more SWT key modifier masks
Spricht nichts gegen Funktionstasten,
aber es hat auch niemand behauptet - oder doch? :noe:
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Zurück
Oben