JTabbedPanel + Label.setText funktionieren nicht

licht400

Mitglied
Hallo.
Habe ein Problem mit setText auf einem Label.
im normalfall kann ich damit umgehen.
das problem ist, wo ich ein tag dran saß, um es herauszufinden liegt daran,
das ich ein jtabbedPanel erstelle und das ganze erzeugt dynamische panels..und darauf produziere ich ein labe und ein button, mit dem ich label.setText machen möcht. das ganze funktioniert nur auf dem letzten tab. Das verstehe ich gerade nicht.
Hier der code der nur den fehler hat ^^
Code:
mport java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;


public class Main extends JDialog {

private JTabbedPane tabPanel;
private JLabel pageDisplay;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        JDialog app = new Main();
        //app.setUndecorated(true);
   app.setSize(1024, 768);
        app.setTitle("^^");
        //app.setResizable(false);
        //app.setAlwaysOnTop(true);
   app.setVisible(true);
    }
   
    public Main() {
       
        erzeugePanels();

    }
    private void erzeugePanels(){
        tabPanel = new JTabbedPane();
        this.getContentPane().setLayout(null);
        tabPanel.setSize(1024,768);
   this.getContentPane().add(tabPanel);
       
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout());
       //Panel Gruppenauswahl
      tabPanel.addTab("Gruppenauswahl",createGroupPanel());
      // Panels Linkauswahl
      for (int i = 0;i<4;i++) {
         tabPanel.addTab("Gruppe"+i+1,createLinkPanel(i));}
    }
   
    private JPanel createGroupPanel() {
      // Panel mit Hintergrundbild laden
      JPanel mainPanel = new JPanel();
      mainPanel.setLayout(new BorderLayout());
      
      return mainPanel;
   }
   
    private JPanel createLinkPanel(int id){
       
        JPanel mainPanel = new JPanel();
   mainPanel.setLayout(new BorderLayout());
       
       
   JPanel cmdPanel = new JPanel();
   //cmdPanel.setBorder(BorderFactory.createLoweredBevelBorder());
   cmdPanel.setOpaque(false);
        cmdPanel.setLayout(new BorderLayout());
        cmdPanel.setPreferredSize(new Dimension(300,75));//185
        mainPanel.add(cmdPanel,BorderLayout.WEST);
               
        JPanel zusatzPanel = new JPanel();
        zusatzPanel.setOpaque(false);
        Container con = zusatzPanel;
        con.setLayout(new GridBagLayout());
        zusatzPanel.setPreferredSize(new Dimension(500,75));
        // zusatzPanel.setBorder(BorderFactory.createLoweredBevelBorder());
        mainPanel.add(zusatzPanel, BorderLayout.EAST);

       
        //zurück
        JButton buttonPrevious = new JButton("previous");   
        buttonPrevious.setPreferredSize(new Dimension(100, 60));
        GridBagConstraints gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.insets = new Insets(2,20, 2, 20);
        gridBagConstraints.anchor = GridBagConstraints.WEST;
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridheight = 2;
        zusatzPanel.add(buttonPrevious, gridBagConstraints);
        buttonPrevious.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("previous gedrückt true");
                    pageDisplay.setText("passiert nix");
                    System.out.println("getText(): "+pageDisplay.getText());
                }

           
        });

        // Seitenanzahl für die Folienseiten
        pageDisplay = new JLabel();
        pageDisplay.setPreferredSize(new Dimension(100, 50));
        // gridBagConstraints = new GridBagConstraints();
        //gridBagConstraints.insets = new Insets(2, 2, 2, 2);
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridheight = 2;
        zusatzPanel.add(pageDisplay, gridBagConstraints);
        pageDisplay.setText(" / ");
        pageDisplay.setBorder(BorderFactory.createLoweredBevelBorder());
        //pageDisplay.setBorder(BorderFactory.createEtchedBorder());
       
    return mainPanel;
    }
   
   
}
 
Hallo,

das ist kein Fehler. Es passiert genau das, was du programmiert hast. Du hast dein JLabel als Klassenvariable deklariert. Dadurch wird dieser Variable jedesmal eine neue Referenz zugewiesen.
So wird halt setText() immer bei der letzten Referenz ausgeführt.

Wenn du das nicht so möchtest, musst du das JLabel als lokale Variable in der Methode anlegen.

Im Vergleich zu deinem Quelltext, gibt es hier in deinem Post jede Menge Fehler. Denn du hast das meiste klein geschrieben und dies ist in der deutschen Sprache nicht so. Deshalb bitte ich dich auf deine Groß- und Kleinschreibung zu achten.

MFG

Sascha
 
Ja tut mir leid.
Werde mich mit meiner Groß und Kleinschreibung im Forum bessern.

Danke für die Antwort.

Ich glaube, es einfach so machen zu müssen.

final JLabel label = new JLabel();

Mein Problem ist, das ich auf das Label aus einer anderen Klasse drauf zugreifen muss. Wie mache ich das? Deswegen dachte ich an eine globale Variable.
Oder sollte ich es so probieren, dass ich mittels einer get Methode mir das Panel gebe, wo das Label drauf ist und dann setText mache
Wenn ja, kann ich mir die Komponente ausgeben lassen, die auf dem Panel drauf ist?
 
Dann müsstest du dir von der TabbedPane das Panel geben lassen.

Du kannst dir von allen Swing-Komponten dir "Kinder" geben lassen. Mit der Methode getComponents() bekommst du ein Array von Component.


MFG

Sascha
 
Ok.
Habe eine getter methode

public JPanel getPanelForLabel(){
return zusatzPanel;
}

und oben in der createLinkPanel(int id)

habe ich am ende ein
System.out.println("Ausgabe Panel: " + this.getPanelForDisplay().getName());

und da bekomm ich nur eine null ausgegeben :(
 
Code:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;


public class Main extends JDialog {
private JTabbedPane tabPanel;
private JPanel zusatzPanel ;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        JDialog app = new Main();
        //app.setUndecorated(true);
	app.setSize(1024, 768);
        app.setTitle("^^");
        //app.setResizable(false);
        //app.setAlwaysOnTop(true);
	app.setVisible(true);
    }
    
    public Main() {
       
        erzeugePanels();
 
    }
    private void erzeugePanels(){
        tabPanel = new JTabbedPane();
        this.getContentPane().setLayout(null);
        tabPanel.setSize(1024,768);
	this.getContentPane().add(tabPanel);
        
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout());
       //Panel Gruppenauswahl
		tabPanel.addTab("Gruppenauswahl",createGroupPanel());
		// Panels Linkauswahl
		for (int i = 0;i<4;i++) {
			tabPanel.addTab("Gruppe"+i+1,createLinkPanel(i));}
    }
    
    private JPanel createGroupPanel() {
		// Panel mit Hintergrundbild laden
		JPanel mainPanel = new JPanel();
		mainPanel.setLayout(new BorderLayout());
		
		return mainPanel;
	}
    
    private JPanel createLinkPanel(int id){
        
        JPanel mainPanel = new JPanel();
	mainPanel.setLayout(new BorderLayout());
       
	JPanel cmdPanel = new JPanel();
	//cmdPanel.setBorder(BorderFactory.createLoweredBevelBorder());
	cmdPanel.setOpaque(false);
        cmdPanel.setLayout(new BorderLayout());
        cmdPanel.setPreferredSize(new Dimension(300,75));//185
        mainPanel.add(cmdPanel,BorderLayout.WEST);
                
        zusatzPanel = new JPanel();
        zusatzPanel.setOpaque(false);
        Container con = zusatzPanel;
        con.setLayout(new GridBagLayout());
        zusatzPanel.setPreferredSize(new Dimension(500,75));
        // zusatzPanel.setBorder(BorderFactory.createLoweredBevelBorder());
        mainPanel.add(zusatzPanel, BorderLayout.EAST);

        // Seitenanzahl für die Folienseiten
        final JLabel pageDisplay = new JLabel();
        pageDisplay.setPreferredSize(new Dimension(100, 50));
        GridBagConstraints gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.insets = new Insets(2,20, 2, 20);
        gridBagConstraints.anchor = GridBagConstraints.WEST;
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridheight = 2;
        zusatzPanel.add(pageDisplay, gridBagConstraints); 
        pageDisplay.setText(" / ");
        pageDisplay.setBorder(BorderFactory.createLoweredBevelBorder());
        //pageDisplay.setBorder(BorderFactory.createEtchedBorder());
        
        //zurück
        JButton buttonPrevious = new JButton("previous");   
        buttonPrevious.setPreferredSize(new Dimension(100, 60));
        gridBagConstraints.anchor = GridBagConstraints.WEST;
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridheight = 2;
        zusatzPanel.add(buttonPrevious, gridBagConstraints); 
        buttonPrevious.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("previous gedrückt true");
                    pageDisplay.setText("passiert nix");
                    System.out.println("getText(): "+pageDisplay.getText());
                }

        
        });

        
    System.out.println("Ausgabe Panel: " + this.getPagePanelForDisplay().getName());  
    return mainPanel;
    }
     
    public JPanel getPagePanelForDisplay(){
            return zusatzPanel;
    }
    
}
 
Das kann ja auch gut sein, wenn du den Namen nicht setzt. So wird es auch nicht funktionieren, da du so auch nur an das letzte Panel kommst.

Was möchtest du denn genau tun?

MFG

Sascha
 
Na ich habe verschiedene Panels. Wie man sehen kann. Und auf dem ZusatzPanel ist das Label drauf. Jetzt, da ich das Label lokal definiert habe komm ich so direkt nicht mehr dran.Also möchte ich über das ZusatzPanel rausbekommen, den Name des Labels und möchte einen neuen Text setzen mit label.setText("irgendwas");

Aber das ich jedesmal eine Null rausbekomme, funktioniert das so wohl nicht ganz.
Sollte doch aber, da es nur ein zusatzPanel mit dem Label gibt. Gerade bin ich ratlos und hilflos :)!
 
Das ist mir schon klar, dass du das vor hast.
Ich wollte wissen, was das ganze bringen soll. Warum hast du auf jeder Seite ein Label, dem du von außen unbedingt einen Text setzen musst.

Mit dem ZusatzPanel ist das nicht anders, als mit dem Label auch. Du weist der Variablen immer wieder eine neue Referenz zu und damit hast auch auch nur das letzte Panel und somit auch nur das letzte Label.
Per getName bekommst du auch nur den Text, den du mit setName() gesetzt hast.

MFG

Sascha
 
Zurück