PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bekommt man bei java...


AHF
2004-03-04, 23:12:18
...auch irgendwelche netten icons für die funktionen speichern (diskette), laden (auch diskette), etc. mitgeliefert oder muss ich mir die selbst irgendwo zusammenklauen?

etwas, was ungefähr so aussähe?

JButton bla = new JButton();
bla.setIcon(System.icons.getDiskette());

HellHorse
2004-03-05, 00:17:29
Ein paar gibt's im look and feel repository (http://java.sun.com/developer/techDocs/hi/repository/) (daufclicken, dann gibt's 16*16 und 24*24)
Dann sollten eigentlich noch andere LAF abhängige rumliegen, wie was Warnicon und so.
Also mal die sourcen öffenen und nach *.gif, *.jpeg, *.png suchen.

Dann gibt es übrigens noch den netten Trick JButton's, JMenuItem's, JMenu's,... mit einer Action als Argument zu kreieren. Dort kann man dann ganz bequem, Label, Icon, Tooltip, Accelerator, Mnemonic, Verhalten bei Clicken, ... festlegen.

Senior Sanchez
2004-03-05, 10:14:36
cool, das mit den Icons habe ich noch nich gewusst, das es da defaultmäßig schon welche gibt.

Aber mal ne Frage zu deinem trick. Meinste jetzt damit, das du dem Konstruktor von ner Swing-Component gleich nen ActionListener übergibst, anstatt den normal per addActionListener() hinzuzufügen?


mfg Senior Sanchez

HellHorse
2004-03-05, 10:52:20
Nein, ich meine sowas:

public class ExitAction extends AbstractAction {

private static final String ACTION_COMMAND = "exit-command";
private static final String NAME = "Beenden";
private static final int MNEMONIC = 'B';
private static final KeyStroke ACCELERATOR = KeyStroke.getKeyStroke("control B");
private static final String SHORT_DESCRIPTION = "Beendet das Programm.";
private static final String LONG_DESCRIPTION =
"Clicken sie hier um das Programm zu beenden.";

private static final ImageIcon SMALL_ICON = new ImageIcon((ExitAction.class).getClassLoader().getResource("axon/res/Exit16.gif"));

public ExitAction() {
super(NAME);
this.putValue(Action.SHORT_DESCRIPTION, SHORT_DESCRIPTION);
this.putValue(Action.LONG_DESCRIPTION, LONG_DESCRIPTION);
this.putValue(Action.MNEMONIC_KEY, new Integer(MNEMONIC));
this.putValue(Action.ACCELERATOR_KEY, ACCELERATOR);
this.putValue(Action.ACTION_COMMAND_KEY, ACTION_COMMAND);
this.putValue(Action.SMALL_ICON, ExitAction.SMALL_ICON);
}

public void actionPerformed(ActionEvent event) {
System.exit(0);
}

}

Wenn man dann

Action exitAction = new ExitAction();
JButton exitButton = new JButton(exitAction);
JMenuItem exitItem = new JMenuItem(exitAction);

macht. Haben der Button und das MenuItem schon ein Label, Icon, Mnemonic, Acceletor, ActionListener und es braucht nicht noch ein halbes dutzend seters. Dafür hast du im schlimmsten Fall eine Klasse für ein Objekt. Was aber aus meiner Sicht OK ist, denn sie bündelt alles, was zusammengehört und macht die Anwendung leichter wartbar.
Das ist ziemlich repetitiv also empfehle ich als erstes ein File Template in der IDE zu machen. Zudem reduziert es den Zeitverlust.
Hier mein Template für IDEA (etwas abgeändert)

package ${PACKAGE_NAME};

import javax.swing.*;
import java.awt.event.ActionEvent;

#parse("File Header.java")
public class ${NAME} extends AbstractAction {
private static final String ACTION_COMMAND = "${DISPLAYNAME}-command";
/** the label text */
private static final String NAME = "${DISPLAYNAME}";
private static final int MNEMONIC = '${MNEMONIC}';
private static final KeyStroke ACCELERATOR =
KeyStroke.getKeyStroke("control ${MNEMONIC}");
/** the tooltip text */
private static final String SHORT_DESCRIPTION = "${SHORTDESCRIPTION}";
/** the contextual help text */
private static final String LONG_DESCRIPTION =
"${LONGDESCRIPTION}";
/** the icon image */
private static final ImageIcon SMALL_ICON = new ImageIcon((${NAME}.class).getClassLoader().getResource(""));

public ${NAME}() {
super(NAME, SMALL_ICON);
this.putValue(Action.SHORT_DESCRIPTION, SHORT_DESCRIPTION);
this.putValue(Action.LONG_DESCRIPTION, LONG_DESCRIPTION);
this.putValue(Action.MNEMONIC_KEY, new Integer(MNEMONIC));
this.putValue(Action.ACCELERATOR_KEY, ACCELERATOR);
this.putValue(Action.ACTION_COMMAND_KEY, ACTION_COMMAND);
}

public void actionPerformed(ActionEvent e) {
}
}


Doku
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/Action.html
http://java.sun.com/j2se/1.5.0/docs/api/index.html

AHF
2004-03-05, 18:09:49
danke.

HellHorse
2004-03-05, 18:18:29
gern geschehen

AHF
2004-03-05, 20:14:18
mal noch ne frage zu den look-and-feels: bei mir gibt es nur metal, motif und windows. kann man irgendwo weitere downloaden und installieren?

ethrandil
2004-03-05, 21:12:42
Klar!
Du lädst die runter, und dann müssen sie immer in den classpath.

Guck z.b. da:
http://www.devx.com/Java/Article/19934

- Eth

AHF
2004-03-05, 23:20:05
werd ich mir mal anschauen, thx.

PH4Real
2004-03-10, 00:37:55
Original geschrieben von HellHorse
Haben der Button und das MenuItem schon ein Label, Icon, Mnemonic, Acceletor, ActionListener und es braucht nicht noch ein halbes dutzend seters. Dafür hast du im schlimmsten Fall eine Klasse für ein Objekt. Was aber aus meiner Sicht OK ist, denn sie bündelt alles, was zusammengehört und macht die Anwendung leichter wartbar.
Das ist ziemlich repetitiv also empfehle ich als erstes ein File Template in der IDE zu machen. Zudem reduziert es den Zeitverlust.


Ahh... das ist ja mal ein interesantes Konzept. Es ist doch wesentlich übersichtlicher, anstatt die Mnemonics etc. nach dem instaziieren des Buttons zu setzen.

Da habe ich doch gleich mal Dein Template in Eclipse gehauen (musste nur ${PACKAGE_NAME} in ${enclosing_package} und ${NAME} in ${enclosing_type} ändern). Ich hoffe mal, dass ich das darf und Du keine Urheberansprüche darauf verfolgst ;).

HellHorse
2004-03-10, 14:15:02
Nee, mach nur.

Das Stringargument für getResource() musst du noch anpassen, und zwar relativ zum Sourcepafd. z.B.
"/dir/subdir/icon.gif"
Zudem musst du aufpassen dass der Accelerator Key gross geschrieben ist.
"control B" geht, "control b" geht nicht.

PH4Real
2004-03-10, 14:44:40
Aha... das der Accelerlator Key gross geschreiben sein muss, wusste ich nicht.

Aber ich habe noch eine Frage zu deinen Konzept... wie machst Du das denn, wenn Du in der eigentlichen actionPerformed Funktion auf z.B. ein bestimmtes JLabel zugreifen willst. Dazu müsste doch jetzt noch irgendwo die Referenz übergeben werden (z.B. gleich im Konstruktor) oder sogar gleich die Referenz des JFrame, so dass man auf alle Komponenten zugreifen kann.
Mich würde interessieren, wie Du das dann machst.

Also bisher hatte ich das so gemacht (am Beispiel eines Buttons):

quickmatchButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
quickmatchButton_actionPerformed(e);
}
});

Für jeden Button hatte ich dann eine eigene actionPerformed Methode in der Klasse. Das Konzept ist vielleicht nicht ideal, war aber einigermaßen übersichtlich (zumindest bei nicht allzu vielen ActionListeners).
In der Funktion quickmatchButton_actionPerformed(e) konnte ich nun natürlich auf weitere Elemente in der Klasse zugreifen.

HellHorse
2004-03-10, 17:38:45
Gegenfrage: Wozu musst du denn auf das JLabel zugreiffen?

Aber irgendwie musst du schon Objektreferenzen kommen, die du brauchst. Wenn sie zur Erstellungszeit bekannt sind, kannst du sie ja als Konstruktorargument übergeben, sonst halt später über einen setter.
Würde aber nur übergeben/verlangen, was gebraucht wird, und nicht mehr.

PH4Real
2004-03-10, 18:22:29
Das mit dem JLabel ist nur ein Beispiel... meinetwegen gibt es einen Button, der die Farbe des JLabels ändern soll (natürlich über SwingUtilities.invokeLater() ;) ), dann muss ich ja die Objektreferenz dazu übergeben. Ich könnte natürlich auch eine Funktion basteln mit dem Namen changecolor (so dass ich nicht direkt auf das JLabel zugreife), aber dann brauch ich ja trotzdem die Referenz des Objekt, welches eben die Funktion changecolor implementiert.

Aber Du hast ja schon die Antwort quasi gleich mitgegeben und würdest es über den Konstruktor bzw. später über Setter machen. Mehr wollte ich ja auch gar nicht wissen :). Danke nochmal.