Sensei: Probleme mit Tabbed Pane

Hi!

Is zwar jetzt nicht direkt zu Webdesign aber ihr helft ja auch bei anderen Dingen meist sehr kompetent!

Habe für eine einfache GUI ein TabbedPane mit 5 Tabs erstellt. Mein Problem: wenn ich das Programm laufen lasse, kann ich zwar alles bedienen, allerdings ist

  1. der hintergrund hinter den tabs halb weiß/grau ==> pfui
  2. sobald ich auf einen anderen tab gehe wird der hintergrund noch komischer mit grafik-fetzen aus der applikation.

grml.

Wisst ihr was mein fehler sein könnte um zu so einer komischen anzeige zu kommen [1.) is schätz ich mal normal, aber 2.)?!?]?

Hier mein Code (der die Tabs betrifft):
--------------------------------------------------------------------
[...]
 private JTabbedPane jTabbedPane = null;
 private JPanel startPanel       = null;
 private JPanel ticketPanel      = null;
 private JPanel userPanel        = null;
 private JPanel filmePanel       = null;
 private JPanel personenPanel    = null;
[...]
 private JTabbedPane getJTabbedPane() {
  if(jTabbedPane == null) {
   jTabbedPane = new JTabbedPane();
   jTabbedPane.addTab("", new ImageIcon(getClass().getResource("/gui/start.png")), getStartPanel(), null);
   jTabbedPane.addTab("", new ImageIcon(getClass().getResource("/gui/tickets.png")), getTicketPanel(), null);
   jTabbedPane.addTab("", new ImageIcon(getClass().getResource("/gui/user.png")), getUserPanel(), null);
   jTabbedPane.addTab("", new ImageIcon(getClass().getResource("/gui/filme.png")), getFilmePanel(), null);
   jTabbedPane.addTab("", new ImageIcon(getClass().getResource("/gui/personen.png")), getPersonenPanel(), null);
   jTabbedPane.setTabPlacement(JTabbedPane.TOP);
  }
  return jTabbedPane;
 }
[...]
---------------------------------------------------------------------

Habts ihr Vorschläge?
Die missratene GUI könnt ihr euch unten anschauen!

cu & thx, Sensei

  1. Hallo,

    1. der hintergrund hinter den tabs halb weiß/grau ==> pfui
    2. sobald ich auf einen anderen tab gehe wird der hintergrund noch komischer mit grafik-fetzen aus der applikation.

    Ich spekuliere jetzt einfach mal:
    Das ganze sieht fast so aus, als wäre dein ContentPane (oder die
    Komponente, in der sich der TabbedPane befindet) nicht opaque. Wenn er
    nicht opaque ist, wird es nicht gezeichnet, als bleiben alte
    Bildschirminhalte an Stellen, an der sich keine Komponente befindet,
    einfach stehen. (Die Darstellung ist an der Stelle undefiniert.)

    Versuch mal dein ContentPane (oder die Komponente, in der sich der
    TabbedPane befindet) mit dem Aufruf von "setOpaque(true)" auf
    undurchsichtig zu schalten. Vermutlich geht's dann schon.

    (Wie ich gerade sehe, wird der ContentPane im TabbedPane-Tutorials von
    Sun auch explizit auf undurchsichtig gesetzt:
    http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/TabbedPaneDemo.java)

    Gruß
    Slyh

    1. Danke für die Hilfe!
      Schaut jetzt VIEL besser aus; zumindest problem 2) is damit gelöst. der hintergrund von den tabs ist jetzt auch nicht mehr weiß, allerdings dunkelgrau (selbes grau wie bei nicht-aktiven Tabs).

      Lieber wäre mir hellgrau - wenn du noch einen Tipp hast..?! Aber sonst auch egal, passt schon.

      Und weil du dich so gut auskennst gleich noch eine Frage. Habe noch ein Problem mit Buttons.
      Und zwar habe ich 3 Buttons: "Neu..." "Ändern..." "Löschen..."

      Diese setze ich mit

      myButton.setPreferredSize(new java.awt.Dimension(85,25));

      auf eine Bestimmte Größe.
      Das klappt bei allen, nur nicht beim "Neu..." Button. Dabei ist er VÖLLIG ident angelegt wie Ändern und Löschen!
      Liegts ev. daran, dass "Neu..." nicht soviele Buchstaben hat wie "Ändern..."?! Aber die Buttongröße müsste ich doch trotzdem beliebig wählen können?
      Die Buttons habe ich übrigens in einem Box-Y-Layout Panel eingebunden, dessen Breite ich mit 90 angegeben habe.

      Also Danke falls du dazu noch was weißt bzw. zu meinem grau Problem, hast mir schon sehr viel geholfen, cu, Sensei

      1. Hallo,

        Schaut jetzt VIEL besser aus; zumindest problem 2) is damit gelöst. der hintergrund von den tabs ist jetzt auch nicht mehr weiß, allerdings dunkelgrau (selbes grau wie bei nicht-aktiven Tabs).

        Lieber wäre mir hellgrau - wenn du noch einen Tipp hast..?! Aber sonst auch egal, passt schon.

        Der ContentPane ist ein Container. Und der hat eine Methode
        setBackground().

        Ich würde aber davon abraten, einfach blind irgendwelche Farben
        fest zu setzen, da du nicht weißt welches Farbschema der Benutzer
        verwendet oder wie sich die Look&Feels in Java weiterentwickeln
        werden. (Das Crossplatform-L&F, das du ja verwendest, sieht in
        Java 1.5 bspw. ganz anders aus...)

        Besser wäre wohl, wenn du dir eine passende Farbe aus dem UIManager
        (Package "javax.swing") holst. Der hat eine Methode "getColor", der
        du als Parameter einen der generischen Farbnamen mitgibst.
        Diese mögliche Farbnamen kannst du über die UIDefault-Klasse
        ermitteln. Die ist von Hashtable abgeleitet, du kannst also alle
        möglichen Keys ermitteln. Die UIDefault-Klasse erhälst du durch
        Aufruf der Methode "UIManager.getDefaults()".
        Das Java-Buch deiner Wahl wird dir die Hintergründe genauer erklären
        können.

        Diese setze ich mit

        myButton.setPreferredSize(new java.awt.Dimension(85,25));

        Das solltest du nicht tun. Der Button weiß sehr genau, wie groß
        er am liebsten wäre. Der verwendete Layoutmanager entscheidet dann,
        wie groß der Button letztendlich wird.
        (Die meisten Layoutmanager ignorieren die PreferredSize in vielen
        Fällen sowieso...)

        Liegts ev. daran, dass "Neu..." nicht soviele Buchstaben hat wie "Ändern..."?! Aber die Buttongröße müsste ich doch trotzdem beliebig wählen können?
        Die Buttons habe ich übrigens in einem Box-Y-Layout Panel eingebunden, dessen Breite ich mit 90 angegeben habe.

        Laut JavaDoc vom BoxLayout sollten alle Komponenten gleich groß --
        nämlich so groß wie die größte Komponente -- gesetzt werden.
        Vielleicht ist es keine gute Idee die Breite des Panels irgendwie
        zu begrenzen. Wie gesagt, der Layoutmanager weiß schon, was er tun
        sollte.
        (Verwende immer Layoutmanager. Positioniere Komponenten nie absolut.)

        Gruß
        Slyh

        1. Danke, werde mir die Dinge mal zu Herzen nehmen und versuchen, alles zu verstehen :-)

          Vielen Dank für die Hilfe & ausführliche Erklärung!

          cu, Sensei