# netbeans JPanel statt beschriftung auf JTabbedPane



## alderwaran (26. Jan 2010)

hi zusammen,

ich bin grade dabei java zu lernen, arbeite dazu ein recht dickes buch mit beispielen durch und bin nun an einer stelle wo ich mich frage was denn die "best practice" sei.

der beispielcode bei dem ich grade bin (s.u.) ist recht einfach gehalten: es soll eine tabbed pane mit 3 tabs erstellt werden, die ersten beiden enthalten je ein jlabel und ein jtextfiled, die dritte eine textarea - so weit so gut.

nachdem ich alle vorangegangenen beispiele brav abgetippt und damit herumgespielt habe dachte ich mir das wäre doch mal eine tolle idee den designer von netbeans auzuprobieren in dem man grafische objekte so toll per grag&drop plazieren und ineinander schieben kann - hat auch geklappt bis zu dem punkt den reiter der dritten tab zu beschriften.
als besonderheit soll die dritte tab nicht wie die vorigen einfach beschriftet sein, sondern eine jpane im tabreiter haben welche wiederum ein jalbel und einen jbutton enthält.

das ist von netbeans nicht vorgesehen. also das draggen einer jpane auf den reiter führt dazu das eine neue tab angelegt, und nicht die jpane anstelle der tabbeschriftung eingesetzt wird.
ich hab mich jetzt mind. eine stunde durch alle möglichen propertys des jtabbedpanels geklickt und frage mich langsam
- hab ich was übersehen, respektive wie realisiert man solche "sonderfälle" und
- wer benutzt eigentlich wie häufig diesen designer um grafische anwendungen zu gestalten? 



```
package de.jse6buch.kap21;

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

public class JFensterMitRegister extends JFrame
{
  public static void main(String[] args)
  {
    JFensterMitRegister f = new JFensterMitRegister();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
  }

  public JFensterMitRegister()
  {
    this.setTitle("Swing-Fenster mit Registerkarten");
    this.setBounds(200, 300, 500, 250);

    JTabbedPane jTP = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);

    JPanel jPnl1 = new JPanel();
    jPnl1.add(new JLabel("Name: "));
    JTextField jTxt = new JTextField();
    jTxt.setPreferredSize(new Dimension(200, 25));
    jPnl1.add(jTxt);

    // ... weitere Personendaten
    jTP.addTab("Person", jPnl1);

    JPanel jPnl2 = new JPanel();
    jPnl2.add(new JLabel("Gehalt: "));
    JTextField jTxt2 = new JTextField();
    jTxt2.setPreferredSize(new Dimension(200, 25));
    jPnl2.add(jTxt2);

    //  ... weitere Personaldaten
    jTP.addTab("vertrauliche Daten", jPnl2);

    // dritte Registerkarte erzeugen
    final JTextArea jTA = new JTextArea();
    jTP.addTab(null, jTA);

    // Panel für Reiter
    JPanel jPnlReiter = new JPanel();
    JLabel jLbl = new JLabel("Optionale Angaben");
    final JCheckBox jCb = new JCheckBox();
    jCb.setSelected(true);
    jCb.addChangeListener(new ChangeListener()
    {
      public void stateChanged(ChangeEvent arg0)
      {
        if(jCb.isSelected())
          jTA.setEnabled(true);
        else 
          jTA.setEnabled(false);
      }    
    });
    jPnlReiter.add(jLbl,BorderLayout.WEST);
    jPnlReiter.add(jCb,BorderLayout.EAST);    
    jTP.setTabComponentAt(2, jPnlReiter);

    this.getContentPane().add(jTP);
  }
}
```


----------



## MQue (26. Jan 2010)

Also das macht meiner Meinung nach wenig sinn, dass man auf den Reiter selber eine Komponente legt, der Reiter ist meines Wissens ein JLabel und da was darüberlegen, halte ich für übertrieben, vor allem was soll das bringen.

Ich verwende den Designer nicht sehr oft, es ist beim Lernen, wie man eine GUI zusammenstellt, ganz nett aber wenn man es selber programmiert, hat man die volle kontrolle über den Code, wenn du den designer nutzt, dann sind manche codezeilen gesperrt, man kann dann zwar diesen Code herauskopierten und in eine andere Klasse stecken, aber wenn man den Code dann ein bisschen verändern will, wirds schwierig, da Netbean eigene Container benutzt.


----------



## L-ectron-X (26. Jan 2010)

Du kannst den vom GUI-Builder erzeugten Code auch in NetBeans verändern/anpassen. Mit Klick auf den Code-Button kann Code an verschiedenen Stellen eingefügt oder komplett benutzerdefinierter Code vorgegeben und generierter Code mit diesem ausgetauscht werden.


----------



## MQue (27. Jan 2010)

Das stimmt schon, aber wer macht das schon, zuerst den Code erzeugen lassen um sich dann damit zu beschäftigen, was da Netbeans macht (Code ist ziemlich kompakt -> das ist auf der einen Seite gut da wenig Code, zum umändern aber umständlich),
Ich würde mich mir der Swing/SWT/AWT programmierung beschäftigen, da bekommt nach nach kurzer Zeit auch sehr gute GUIs hin.


----------



## L-ectron-X (27. Jan 2010)

In den meisten Fällen ist es aber auch gar nicht nötig, am generierten Code Hand anzulegen.
Wenn du dir im GUI-Builder deine Oberfläche erzeugst, braucht dich der Code dahinter auch nicht unbedingt zu interessieren. Alles was dann ein Programmierer noch machen muss, sind die Zugriffsmethoden auf die Instanzvariablen zu schreiben. Mehr muss ein GUI auch gar nicht machen.


----------



## alderwaran (27. Jan 2010)

@mque: stimmt der code macht nicht oft sinn (obwohl mir spontan zumindest *ein* anwendungsfall einfällt) aber es ist halt beispielcode... java ermöglicht es das tabbeschriftungsobjekt zu verändern und netbeans' gui designer hat das nicht intuitiv implementiert, darum gehts mir. 

@L-ectron-X: prinzipiell geht es ja darum

```
JLabel jLbl = new JLabel("Optionale Angaben");
    final JCheckBox jCb = new JCheckBox();
    jCb.setSelected(true);
    jCb.addChangeListener(new ChangeListener()
    {
      public void stateChanged(ChangeEvent arg0)
      {
        if(jCb.isSelected())
          jTA.setEnabled(true);
        else 
          jTA.setEnabled(false);
      }    
    });
    jPnlReiter.add(jLbl,BorderLayout.WEST);
    jPnlReiter.add(jCb,BorderLayout.EAST);    
    jTP.setTabComponentAt(2, jPnlReiter);
```
unter verwendung des richtigen jtabbedpane-objekts an der richtigen stelle im generierten code einzufügen.
ehrlich gesagt habe ich schwierigkeiten unter





wie von dir vorgeschlagen den richtigen punkt zu finden. für hints wäre ich wirklich dankbar 

für die zukunft glaube ich wird es wohl eine mischung aus gui-designer und manuellem erstellen sein. was mir als unerfahrenem anfänger auffällt und bitter aufstösst ist zu sehen das designen und manuelle gestaltung wohl sehr unterschiedliche ansätze sind... alleine schon das der gui-builder für jede beschriftung auf externe resource-files zugreift. ist vielleicht ein vorteil - aber das kann ich bisher nicht erkennen.


----------



## Gast2 (27. Jan 2010)

Solche "Spezial-Fälle" kann der Netbeans GUI Designer nicht. Du kannst einfach deinen code im Post-Creation Block einfügen (alternativ auch schon im Custom Creation Block). Das Problem ist nur das du das dann in der Preview nicht sehen wirst


----------

