JTabbedPane: tab-Platzierung "LINKS" eingestellt, aber die icons sind nicht ausgerichtet
Ich habe eine JTabbedPane
mit tab-Platzierung "LINKS" eingestellt. Das problem ist, dass Symbole in jeder Registerkarte sind nicht senkrecht aufeinander abgestimmt.
Betrachten Sie dieses Bild:
Wie Sie sehen können, das Symbol des "Editar Protocolo" (zweite Registerkarte) ist nicht perfekt ausgerichtet mit dem Symbol "Distribuir Protocolo" (erste Registerkarte), und dies passiert auch mit den anderen tabs. Ich möchte alle icons werden vertikal ausgerichtet auf der linken Seite.
Dies ist der code, den ich verwende zum einstellen der Registerkarte Komponenten:
...
jtabbedPane.setTabComponentAt(1, configurarJtabbedPane("Editar Protocolo", iconEditarProtocolo));
...
public JLabel configurarJtabbedPane(String title, ImageIcon icon) {
JLabel l = new JLabel(title);
l.setIcon(icon);
l.setIconTextGap(5);
l.setHorizontalTextPosition(SwingConstants.RIGHT);
return l;
}
Dem code extrahiert aus diesem Q&A:JTabbedPane: Symbol auf der linken Seite des tabs.
- 1) Für besser zu helfen, schneller zu veröffentlichen, MCVE (Minimal-Vollständige, Überprüfbare Beispiel). 2) Ein Weg, um Bilder für ein Beispiel, ist die hot link auf Bilder gesehen in diese F&A.
- wie dieser code ist nicht ein MCVE? mehr als das Sie sehen möchten der JFrame frame = new JFrame();
- Es ist M, aber nicht von C, V oder Z Folgen Sie dem link, Lesen Sie über der MCVE.
- Nicht sicher, ob ich die Frage verstehe. Es scheint sich zum Standard-Verhalten. Siehe den Abschnitt aus dem Swing-tutorial auf Wie zu Verwenden TabbedPanes für weitere Informationen und Beispiele.
- ich meine, voll auf den linken, nicht je in den JLabel-text-Größe wie diese, zu sehen, wie die "Editar Protocolo" - Symbol ist nicht genau unter der Distribuir protocolo?
- Ich denke, andere Leute falsch verstanden deine Frage. Während die Frage der Qualität könnte verbessert werden, ich glaube nicht, dass es geschlossen werden weil es ein wirklich Interessantes Thema.
InformationsquelleAutor user2582318 | 2014-10-10
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Registerkarte Inhalt zentriert ist, die von typischen Implementierungen, und es macht Sinn, weil die Fläche benötigt, um fit dieser Inhalt ist unvorhersehbar, bis das tab ist effektiv gerendert. Da der Bereich hängt von den Inhalten und der verschiedenen Registerkarten wird wahrscheinlich verschiedene Titel Längen, dann muss es eine Richtlinie, wie zum Rendern dieser Registerkarten. Die Kriterien war die center tabs Inhalt und passen Sie die Registerkarte Bereich, um diese Inhalte. Wenn wir einen Standard tabbed pane mit Registerkarten platziert an der Spitze, wir kümmern uns nicht viel über icon/Textausrichtung:
Die einzige Sorge könnte sein, tabs mit unterschiedlicher Länge, aber who cares? Nach allem, Symbole und Texte sind sichtbar und tabbed pane gut genug aussieht. Jedoch, wenn Sie die Registerkarten Platzierung LINKS oder RECHT sind die Dinge anders, und es sieht unattraktiv:
Anscheinend das default-Verhalten ist ein langjähriges problem, und es ist eine wirklich interessante Diskussion hier. Einige Mitglieder beteiligt sind, die es gibt: @camickr, @kleopatra, @splungebob. Wie bereits in diesem post eine einfache Lösung ist nicht möglich, und verschiedene workarounds vorgeschlagen: im Grunde eine eigene UI-Implementierung oder Verwendung von Platten als Renderer und spielen mit bevorzugte Breite/Höhe basierend auf dem text, Länge. Beide alternativen beinhalten eine ganze Menge Arbeit.
Um zu vermeiden, Umgang mit UI Delegierten und nutzen
setTabComponentAt(...)
Methode, die ich angefangen habe vor einiger Zeit ein tabbed pane Erweiterung, die ich teilen möchte, hier. Der Ansatz basiert auf Swing-Konzept der renderer: eine Klasse, die zum erzeugen einer Komponente für die Darstellung einer anderen Komponente gehört, und das Ziel ist, bieten eine flexible Möglichkeit zum hinzufügen von benutzerdefinierten Registerkarte Komponenten.Ich habe ein Beispiel unten mit meiner benutzerdefinierten Registerkarten Bereich und hier ist eine übersicht über alle Schnittstellen/Klassen erforderlich, um die oben genannten Mechanismus.
ITabRenderer-Schnittstelle
Der erste Schritt ist die Definition eines iterface ein Vertragsangebot zu machen eine tab-Komponente.
AbstractTabRenderer Klasse
Einer abstrakten Klasse, der Basis-Methoden zu helfen, in die
getTabRendererComponent(...)
Methode der Umsetzung. Diese abstrakte Klasse besitzt drei wesentliche Eigenschaften:prototypeText
: verwendet, um zu definieren, einen Prototyp text zum generieren einer Standard-renderer-Komponente.prototypeIcon
: verwendet, um zu definieren, einen Prototyp Symbol zum generieren einer Standard-renderer.horizontalTextAlignment
: tab text, die horizontale Ausrichtung.Hinweis: diese Klasse ist Abstrakt, weil es nicht umsetzen
getTabRendererComponent(...)
Methode.DefaultTabRenderer Klasse
Konkrete Umsetzung durch die Ausweitung
AbstractTabRenderer
Klasse. Beachten Sie, dass wenn Sie möchten, um eine Schaltfläche schließen, wie gezeigt, in tutorial demo, dann ein wenig Arbeit in dieser Klasse ausreichen würde. Als eine Angelegenheit von der Tat, das habe ich schon, aber ich will nicht zählen, das Teil nicht zu verlängern, diese (ohnehin schon großen) posten.JXTabbedPane
Schließlich die tabbed-pane-Erweiterung, die befehlsvervollständigung mit der tab-renderer unterstützen und überschreibt
addTab(...)
Methoden.Beispiel
Ich habe dieses Beispiel ausführen zu können, die positive Ergebnisse mit diesen PLAFs:
Zusätzlich beim wechseln der Registerkarte Platzierung von LINKS zu TOP (Standard) oder UNTEN dann alle tabs immer noch mit der gleichen Breite, die Lösung der Sorge, gemäß dem zweiten Absatz dieser Antwort.
Screenshots
MetalLookAndFeel
NimbusLookAndFeel
SeaglassLookAndFeel
WindowsLookAndFeel
Es ist nicht klar, aus deinem fragment, wo die Ausrichtung schief geht.
TabComponentsDemo
ist ein komplettes Beispiel, das veranschaulicht, wie erstellen Registerkarten Mit Benutzerdefinierten Komponenten. InButtonTabComponent
, beachten Sie, wie die Komponente erhält eineFlowLayout
mitFlowLayout.LEFT
Ausrichtung. Man könnte dies vergleichen mit Ihrem aktuellen Ansatz.Gibt es eine einfachere Lösung mit HTML-Formatierung:
was ich Tat, war, fügen Sie eine Komponente (ein JPanel in diesem Fall) für die tab. Ich brauchte, um fügen Sie ein Kontrollkästchen auf den Registerkarten, so dass statt einer checkbox könnte man hinzufügen, das Symbol manuell.
hier ist mein code:
Ich weiß, es ist keine gute Praxis zur Beurteilung der Größe der Platten, aber diese ist die einfachste Methode, die ich finden konnte. Die Ergebnisse sind:
Beispiel