PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : JPieMenu


ethrandil
2006-09-30, 14:26:05
Hi,
ich hab grade einen kleinen Versuch gestartet PieMenüs für Java zu programmieren. Mein Ergebnis nach zwei Tagen könnt ihr euch gerne angucken :).

Wenn ihr bestimmte Features wollt oder Ideen habt, meldet euch.
Die erste Release mit Source erwarte ich in 1 - 2 Wochen - muss erst den Code aufmöbeln *g*.

http://rapidshare.de/files/35032252/piemenu3.jar.html

mfg
- eth

Irgendwie gehen keine Anhänge?
http://img140.imageshack.us/img140/6883/bildschirmphoto3bw9.png

MadMan2k
2006-09-30, 15:12:55
Wenn ihr bestimmte Features wollt oder Ideen habt, meldet euch.
ja das ganze mit AA, also in cairo-java.

HellHorse
2006-09-30, 15:41:50
ja das ganze mit AA, also in cairo-java.
Java2D konnte das schon lange bevor es cairo gab.

edit:
Will bei mir nicht. Es passiert / erscheint nicht und schliesslich das:
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: com/sun/java/swing/SwingUtilities2
at de.ethrandil.menus.PieItem.paintComponent(PieItem.java:139)
at javax.swing.JComponent.paint(JComponent.java:1022)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5104)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java: 1386)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1317)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:301 )
at javax.swing.RepaintManager.paint(RepaintManager.java:1132)
at javax.swing.JComponent._paintImmediately(JComponent.java:5052)
at javax.swing.JComponent.paintImmediately(JComponent.java:4862)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:727)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:683)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:663)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueU tilities.java:128)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273 )
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThred.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Da verwendet doch nicht etwa jemand die interene Sun API?

ethrandil
2006-09-30, 15:56:34
Java2D konnte das schon lange bevor es cairo gab.
Ja genau. Wenn ich MFC einbaue wird auch das konfigurierbar werden.

Da verwendet doch nicht etwa jemand die interene Sun API?Upps erwischt *g*
Und dazu wars auch noch unnötig. Naja der Fehler sollte nun weg sein. SwingUtilities verwende ich aber immernoch. Wie intern ist das denn? Genauer gesagt verwende ich die Methode .invokeLater( ) . Ist das problematisch?

Welches JRE verwendest du?

http://rapidshare.de/files/34983996/piemenu2.jar.html

mfg
- eth

EDIT: Das Menü hat einen kleinen Lag, weil ich einen nicht sehr performanten Hack verwende um ein durchsichtiges Fenster zu erzeugen. (Es wird erst ein Screenshot erstellt...)

HellHorse
2006-09-30, 19:04:42
Naja der Fehler sollte nun weg sein. SwingUtilities verwende ich aber immernoch. Wie intern ist das denn?
alles was
java.*
javax.*
org.*
ist öffentlich. Das kannst kannst du problemlos brauchen, das muss überall drin sein wo Java drauf steht.
com.* insbesondere com.sun.* ist intern und "böse". Nur verwenden wenn es nicht anders geht und man einen Fallback hat. Das kann auch schon mal von Sun release zu release ändern.

SwingUtilities (ohne 2) ist öffentlich also kein Problem.
Genauer gesagt verwende ich die Methode .invokeLater( ) . Ist das problematisch?
Nö, siehe oben.

Welches JRE verwendest du?[/quote]
$java -version
java version "1.6.0-rc"
Java(TM) SE Runtime Environment (build 1.6.0-rc-b99)
Java HotSpot(TM) Client VM (build 1.6.0-rc-b99, mixed mode, sharing)


http://rapidshare.de/files/34983996/piemenu2.jar.html
Sun 1.4.2_12-b03: nicht unterstützt
Sun 1.5.0_08-b03: gayt aber irgenwie kann ich nichts anderes als 0 auswählen
Sun 1.6.0-rc-b99: gayt ned, kommt kein Menu
Sun 1.7.0-ea-b01: gayt ned, kommt kein Menu
IBM J9 VM (build 2.3): gayt aber irgenwie kann ich nichts anderes als 0 auswählen
Bea R26.4.0-63-63688-1.5.0_06-20060626-2259: gayt aber irgenwie kann ich nichts anderes als 0 auswählen, zudem geht die Nachricht immer wieder in den Hintergund, man kann sie nicht bestätigen.

Da scheint es noch einen Renderingbug bezüglich Transparenz zu geben:
http://img172.imageshack.us/img172/9181/piebugrf7.th.png (http://img172.imageshack.us/my.php?image=piebugrf7.png)
(slice 1 und 2 haben nicht die gleiche Transparenz, siehe Schrift)

Da du ja sowieso zu wenig zu tun hast:
Wäre cool wenn das ganze mit Actions laufen würde. Und natürlich Tooltips, Icons, ...
Ach ja, und wenn man in der Mitte irgendwie auf das Obermenü zurück käme.

ethrandil
2006-09-30, 19:09:30
Da du ja sowieso zu wenig zu tun hast:
Wäre cool wenn das ganze mit Actions laufen würde. Und natürlich Tooltips, Icons, ...
Ach ja, und wenn man in der Mitte irgendwie auf das Obermenü zurück käme.
Icons gehen, Tooltips sollten auch gehen. Actions sind nur eine Konstruktorsache.

Mein JPieMenu erbt von JPopupMenu und kann imho ne Menge der Funktionen übernehmen.
Was genau meinst du mit dem letzten Punkt? Welches 'Obermenü'?

Die Transparenz steigert sich im Uhrzeigersinn - das ist kein Bug, das ist ein Feature xD. Jedes JPieItem (erbt von JMenuItem) hat eine eigene Transparenz.

EDIT: Tooltips machen komische Grafikfehler o.o

- eth

HellHorse
2006-09-30, 21:17:52
Was genau meinst du mit dem letzten Punkt? Welches 'Obermenü'?
Dass man verschachtelte Menus bauen kann. D.h. wenn ich ein Menu anklicke kommt im Pie das Untermenu, wenn ich dann in die Mitte klicke komme ich wieder ins Obermenu.

ethrandil
2006-09-30, 21:31:16
Dass man verschachtelte Menus bauen kann. D.h. wenn ich ein Menu anklicke kommt im Pie das Untermenu, wenn ich dann in die Mitte klicke komme ich wieder ins Obermenu.
Ah okay :) Das ist eine gute Idee!

Hast du eine Idee, wieso ich bei meiner jetzigen Implementierung (nicht die, die ihr getestet habt) Probleme bekomme wenn ich DoubleBuffering eingeschaltet lasse?
Ich bekomme dann in den Randbereichen Bildermüll aus anderen Bildbereichen.

mfg
- eth

Ganon
2006-09-30, 21:54:48
OS X 10.4.8
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-110)
Java HotSpot(TM) Client VM (build 1.5.0_06-61, mixed mode, sharing)

1. Hab ich um den Kreis noch ein sichtbares viereck.

2. Wenn man die rechte Maustaste gedrückt hält und dann was auswählt und wieder los lässt, dann wählt er Item 0 aus und danach geht nix mehr, bis man das Programm neu startet.

ethrandil
2006-09-30, 22:16:00
1. Hab ich um den Kreis noch ein sichtbares viereck.Okay... den Bug werde ich kaum beheben können. Das wird an dem DirtyHack(tm) für die Transparenz liegen...

2. Wenn man die rechte Maustaste gedrückt hält und dann was auswählt und wieder los lässt, dann wählt er Item 0 aus und danach geht nix mehr, bis man das Programm neu startet.Jupp, ist bekannt. Werde ich mir noch anschauen, ist aber schwer zu debuggen :/

- eth

ethrandil
2006-10-01, 00:05:09
Neue Version :)

http://rapidshare.de/files/35032252/piemenu3.jar.html

- der Bug, dass nach Rechtsklicks immer automatisch die '0' ausgewählt wird, taucht bei mir nicht mehr auf. Vielleicht wurde der mit anderen Bugs zusammen gefixt?
- Schrift mit Antialiasing
- Icons zur Demo eingebaut ;)
- Tooltips gehen (aber nur, als Hardweight...)

TODO:
- Untermenüs
- Bugfix für OS-X (falls möglich)
- DoubleBuffering wieder ermöglichen
- Support für non-Sun-VMs

HellHorse, kannst du das nochmal auf deinen verschiedenen JREs laufen lassen? Wär total cool.

mfg
- eth

Erste Version mit Untermenüs: http://rapidshare.de/files/35049474/piemenu4.jar.html
bekannte Fehler:
- OK-Button wird unter den anderen Komponenten gerendert
- Flackern weil kein Doublebuffering

ethrandil
2006-10-02, 03:24:55
Hallo,

ich stehe gerade vor ienem klitzekleinen Entwurfsproblem. Die Vererbungshierarchie für JMenu ist ausschnittweise wiefolgt:

Object .... < JMenuItem < JMenu
und
Object .... < BasicMenuItemUI < BasicMenuUI

Ich habe JPieItem und JPieMenu, welche ich entsprechend ableite.
Ebenso leite ich PieItemUI und PieMenuUI ab.
Das Problem an letzterem ist die Codeduplizierung, denn die Zeichenroutinen für die beiden Komponenten sind eigentlich exakt identisch, liegen aber in unterschiedlichen Klassen die nicht direkt voneinander erben.

Ich kann aber auch nicht einfach mein PieMenuUI von PieItemUI ableiten, denn dann fehlen mir die Standard-Mouselistener, die ich durch das Ableiten von BasicMenuUI erhalte!

Was denkt sich der Mensch? Utilityklassen. Geht aber auch nicht, weil ich in den Methoden die ich dupliziert habe, einen super.dieMethode()-Aufruf habe.
Muss ich da nun wirklich noch einen Callback (unter Java... :rolleyes: ) einbauen oder bin ich auf dem falschen Dampfer?

Beispielcode:

public class PieItemUI extends BasicMenuItemUI {
@Override
protected void paintMenuItem(Graphics g, JComponent c, Icon checkIcon,
Icon arrowIcon, Color background, Color foreground,
int defaultTextIconGap) {
JPieItem pieItem = (JPieItem) menuItem;
int alpha = pieItem.getAlpha();

// Paint transparent background
if (alpha < 255) {
paintTransparentBackground(g, pieItem);
}

// Paint background, icon, text, ...
super.paintMenuItem(g, c, checkIcon, arrowIcon, background, foreground,
defaultTextIconGap);
}
}

public class PieMenuUI extends BasicMenuUI {
@Override
protected void paintMenuItem(Graphics g, JComponent c, Icon checkIcon,
Icon arrowIcon, Color background, Color foreground,
int defaultTextIconGap) {
JPieMenu pieItem = (JPieMenu) menuItem;
int alpha = pieItem.getAlpha();

// Paint transparent background
if (alpha < 255) {
paintTransparentBackground(g, pieItem);
}

// Paint background, icon, text, ...
super.paintMenuItem(g, c, checkIcon, arrowIcon, background, foreground,
defaultTextIconGap);
}
}

- eth

EDIT: Funzt aber pfui!
public class PiePaintingUtility {
public static void paintMenuItem(Runnable superCallback, Graphics g, JComponent c, Icon checkIcon,
Icon arrowIcon, Color background, Color foreground,
int defaultTextIconGap) {
int alpha = pieItem.getAlpha();

// Paint transparent Background
if (alpha < 255) {
paintTransparentBackground(g, c);
}

// super.paintMenuItem(g, c, checkIcon, arrowIcon, background, foreground,
// defaultTextIconGap);
superCallback.run();
}
}

public class PieItemUI extends BasicMenuItemUI {
protected void paintMenuItem(final Graphics g, final JComponent c, final Icon checkIcon,
final Icon arrowIcon, final Color background, final Color foreground,
final int defaultTextIconGap) {

PiePaintingUtility.paintMenuItem(new Runnable(){
public void run() {
PieItemUI.super.paintMenuItem(g, c, checkIcon, arrowIcon, background, foreground,
defaultTextIconGap);
}}, g, c, checkIcon, arrowIcon, background, foreground, defaultTextIconGap);
}
}