Ich habe mich in den letzten Monaten sehr über das neue Feature zum Beispiel in Firefox oder im Windows Dateiexplorer aufgeregt, in Menüs Toolbars als Menuitems zu integrieren. Aber ich habe es auch als Herausforderung begriffen und wollte sehen, ob es in Java möglich ist und wie kompliziert es sein würde...
Um zunächst noch einmal zu erklären, worum es mir geht hier ein weiteres Beispiel - dieses Mal aus Thunderbird. Man sieht sehr schün die ganz oben hinzugefügte Reihe aus Buttons im Menü.
Beispiel für eine Toolbar in einem Menü in Thunderbird
Aus meiner Sicht eine klare UX-Todsünde: wir erwarten von Menüs ein ganz bestimmtes Verhalten - und das ist zunächst erst einmal, eine textliche Information darüber, was jeder einzelne Menüpunkt macht, eventuell unterstützt von passenden Symbolen. Diese neue Art, Menüs zu verhunzen bricht diese Erwartung und zeigt uns - oftmals zu kleine, schwierig zu erkennende oder einfach nicht zu der dahinterliegenden Funktionalität passende - Symbole ohne jede Erklärung. Diese muss man sich erst umständlich über den jeweiligen Tooltip holen - falls es denn einen für diese Knöpfe gibt.
Aber ich betrachtete das wie gesagt als Herausforderung - hier also meine Umsetzung: Zunächst das Ergebnis und unten angehängt dann der Quelltext.
Die Java-Implementierung
import javax.swing.Action;
import javax.swing.JButton;
public class ToolbarMenu extends java.lang.Object
{
public ToolbarMenu()
{
super();
// setup the frame
javax.swing.JFrame f=new javax.swing.JFrame();
javax.swing.JPanel p=new javax.swing.JPanel(new java.awt.BorderLayout());
p.add(new javax.swing.JLabel("Proxy label proxy label proxy label"));
f.setContentPane(p);
// setup menu infrastructure
javax.swing.JMenuBar mb=new javax.swing.JMenuBar();
javax.swing.JMenu m=new javax.swing.JMenu("Project");
// special component: MenuItem containing actions inside a JToolBar
javax.swing.JToolBar tb=new MenuItemToolBar(m);
tb.setFloatable(false);
// create some actions
javax.swing.Action openAction=new de.netsysit.util.pattern.command.ChooseFileAction(null,null,de.netsysit.util.ResourceLoader.getIcon("toolbarButtonGraphics/general/Open24.gif"));
javax.swing.Action renameAction=new javax.swing.AbstractAction(null,de.netsysit.util.ResourceLoader.getIcon("de/netsysit/ressources/gfx/common/Rename24.gif")){public void actionPerformed(java.awt.event.ActionEvent e){}};
// add a few actions to the toolbar
tb.add(new javax.swing.AbstractAction("1"){public void actionPerformed(java.awt.event.ActionEvent evt){}});
tb.add(new javax.swing.AbstractAction("22"){public void actionPerformed(java.awt.event.ActionEvent evt){}});
tb.add(openAction);
tb.add(renameAction);
// finish setting up the menu and add it to the frame
m.add(new javax.swing.AbstractAction("1"){public void actionPerformed(java.awt.event.ActionEvent evt){}});
m.add(new javax.swing.AbstractAction("22"){public void actionPerformed(java.awt.event.ActionEvent evt){}});
mb.add(m);
p.add(mb,java.awt.BorderLayout.NORTH);
// layout and open the frame
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
public static void main(java.lang.String[] args)
{
new ToolbarMenu();
}
public static class MenuItemToolBar extends javax.swing.JToolBar
{
private final javax.swing.JMenu m;
private final javax.swing.JMenuItem i;
public MenuItemToolBar(javax.swing.JMenu m)
{
super();
this.m=m;
i=new javax.swing.JMenuItem("huhu");
m.add(i);
i.removeAll();
i.add(this);
}
@Override
public JButton add(Action a)
{
JButton rv=super.add(new CloseMenuAction(m,a));
i.setPreferredSize(this.getPreferredSize());
if(getParent()!=null)
{
getParent().invalidate();
getParent().validate();
getParent().doLayout();
}
return rv;
}
}
public static class CloseMenuAction extends javax.swing.AbstractAction
{
private final javax.swing.JMenu m;
private final javax.swing.Action a;
CloseMenuAction(javax.swing.JMenu m, javax.swing.Action a)
{
super();
this.m=m;
this.a=a;
}
@Override
public void actionPerformed(java.awt.event.ActionEvent e)
{
a.actionPerformed(e);
m.dispatchEvent(new java.awt.event.KeyEvent(m, java.awt.event.KeyEvent.KEY_PRESSED, 0, 0, java.awt.event.KeyEvent.VK_ESCAPE));
m.getPopupMenu().setVisible(false);
}
@Override
public Object getValue(String key)
{
return a.getValue(key);
}
@Override
public void putValue(String key, Object newValue)
{
a.putValue(key, newValue);
}
}
}
Demonstration und Beispiele für die Nutzung eines RFC3161-Servers aus Java heraus
15.05.2021
Ich habe ein Begleitprojekt zu meiner Implementierung meines Timestamping Server Projekts erstellt: eine Demonstration und ein Beispiel dafür, wie man einen solchen Timestamping-Server von Java aus nutzen kann.
WeiterlesenAI und ML Android Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Go GUI Hardware Java Jupyter JupyterBinder Komponenten Links Linux Markdown Markup Music Numerik OpenSource PKI-X.509-CA Präsentationen Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
Asymmetrische KryptographieIch habe mich mit der Idee schon länger getragen: Nochmal einen Rundumschlag zu asymmetrischer Kryptographie zu machen. Dabei werde ich mich auf Demonstrationen der einzelnen Konzepte und Operationen mit Beispielcode konzentrieren und zu jedem der vorgestellten Konzepte mehr oder weniger ausführlich bezüglich der Einsatzszenarien und Vor- und Nachteile Stellung beziehen
WeiterlesenHin und wieder erlebe ich es persönlich oder lese davon, dass jemand die Frage stellt, wie kryptographische Geheimnisse gesichert werden können. Ich gebe hier mal einen Anstoß, darüber aus der Sicht der Software-Architektur auf Systemebene nachzudenken...
WeiterlesenIch habe mich von einigen Artikeln anderer Besitzer und Upcycler von Futro-Thin-Clients inspirieren lassen - das hat dazu geführt, dass ich von meinem eigentlichen Projekt (Bauen eines kleinen Clusters) abgekommen bin und die Hardware ein wenig genauer unter die Lupe genommen habe...
WeiterlesenManche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.
Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.
Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...
PS: Meine öffentlichen Codeberg-Repositories findet man hier.