Lokale Klassen und Zugriff.

Status
Nicht offen für weitere Antworten.

Hampek

Mitglied
Hallo,

ich hätte mal eine Anfängerfrage...

Nehmen wir an wir haben diesen Code-Rahmen:

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

public class A
{
    public static void main(...)
    { 
        ...
        JCheckBox cb1 = new JCheckBox("Textfeld 1");
        JCheckBox cb2 = new JCheckBox("Textfeld 2");
        ...
        
        class B implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
            {
                if ( cb1.isSelected() ) // HIER LIEGT AUCH MEIN PROBLEM
                ...
            }
        }
    }
}
So weit so gut... Jetzt möchte ich aber in der Methode actionPerformed der Klasse B die Abfrage cb1.isSelected() machen, doch der Compiler meldet mir, dass cb1 unbekannt ist! 🙁

Wie kann ich das Problem lösen?

Vielen Dank!

Gruß
Hampek
 
meinst du sowas?

Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JCheckBox;
import javax.swing.JFrame;


public class X {
	
	private static JCheckBox cb1 = new JCheckBox("test");
	
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setSize(200,200);
		
		frame.getContentPane().add(cb1);
		
		B b = new B();
		cb1.addActionListener(b);
		cb1.setName("BALBALABLA");
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	static class B implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent arg0) {
			JCheckBox box = (JCheckBox)arg0.getSource();
			
			System.out.println(box.isSelected());	
			System.out.println(box.getName());	
		}	
	}
}
 
Hallo,

hmm - also in diesem Beispiel ist die Klasse B direkt in der Klasse X definiert. In meinem Beispiel müsste aber die Klasse B innerhalb der main()-Methode der Klasse X deginiert worden sein...

Gruß
Hampek
 
also eine annonyme innere Klasse..?
Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JCheckBox;
import javax.swing.JFrame;

public class X {

	private static JCheckBox cb1 = new JCheckBox("test");

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setSize(200, 200);

		frame.getContentPane().add(cb1);

		cb1.setName("BALBALABLA");
		//annonyme innere Klasse
		cb1.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				JCheckBox box = (JCheckBox) arg0.getSource();
		
				System.out.println(cb1 == box);
				System.out.println(cb1.isSelected());
			}
		});

		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
 
oder cb1 final machen, dann kannst du die Variable direkt ansprechen
 
na dann so?
Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JCheckBox;
import javax.swing.JFrame;

public class X {

	private static JCheckBox cb1 = new JCheckBox("test");

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setSize(200, 200);

		frame.getContentPane().add(cb1);

		cb1.setName("BALBALABLA");
		
		ActionListener b = new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println(cb1.isSelected());				
			}		
		};
		cb1.addActionListener(b);

		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}

EDIT: das wären dan so ca alle Möglichkeiten...

und noch die final Variante vom Gast
Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JCheckBox;
import javax.swing.JFrame;

public class X {

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setSize(200, 200);

		final JCheckBox cb1 = new JCheckBox("test");
		frame.getContentPane().add(cb1);
				
		cb1.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println(cb1.isSelected());				
			}				
		});

		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
 
Hallo,

also ich komme leider immer noch nicht weiter... Der Tipp mit final wird nicht funktionieren, da es zum Kompilierzeitpunkt nicht bekannt ist, ob das Häckchen bei der Variablen vom Typ JCheckBox gesetzt ist oder nicht. 🙁

Mit dem anderen Code kann ich leider nicht viel anfangen, bin wohl noch nicht so weit.

Hier mein CODE:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class OflDemo {

 public static void main(String args[]) {


   //// Deklarationen fuer Komponenten der Oberflaeche:

   JFrame frame;              // Rahmen der Oberflaeche
   JLabel label1, label2;              // fester Text
   JButton button1, button2, button3;  // Buttons
   JTextField textfeld1, textfeld2;       // Feld zur Textausgabe
   JPanel checkboxpanel;
   
   // Listener fuer die Buttons:
   // Definiert Aktion, die beim Druecken der Buttons ausgefuehrt werden soll


  class ButtonListener implements ActionListener {

    JTextField tf;  // Textfeld, in das der ButtonListener eine Ausgabe schreiben soll

    // Konstruktor zur Initialisierung des Attributs tf

    ButtonListener(JTextField tf) {
     this.tf = tf;
    }

    // Operation, die beim Druecken des Buttons ausgefuehrt werden soll:
 
    public void actionPerformed(ActionEvent e) {
 
     // Ermittlung der Beschriftung des gedrueckten Buttons:

     String ButtonText = new String(((JButton)e.getSource()).getText());

     // je nach Beschriftung Setzen oder Loeschen des Textfelds:
 

     if (ButtonText.equals("Textfeld setzen") && checkbox1.isSelected()) // HIER IST MEIN PROBLEM
      tf.setText("HELLO WORLD");
     if (ButtonText.equals("Textfeld loeschen"))
      tf.setText("");
     if (ButtonText.equals("Quit"))
       System.exit(0);

    }

  }

   //// Anweisungen zur Erzeugung der Oberflaeche:

   // Frame erzeugen:

   frame = new JFrame("Ein erster Frame");

   // Frame-Layout setzen:

   frame.getContentPane().setLayout(new GridLayout(9,1));

   // Label1 mit Beschriftung und Zeichentyp erzeugen ...

   label1 = new JLabel("Erstes Textfeld:");
   label1.setFont(new Font("Arial",Font.BOLD,14));
   label1.setForeground(Color.blue);

   // ... und zum Frame hinzufuegen:
   frame.getContentPane().add(label1);
   
   // Textfeld1 mit Zeichentyp und -farbe erzeugen ...
   textfeld1 = new JTextField();
   textfeld1.setFont(new Font("Arial",Font.BOLD,24));
   textfeld1.setForeground(Color.red);

   // ... und zum Frame hinzufuegen:

   frame.getContentPane().add(textfeld1);

   // Label2 mit Beschriftung und Zeichentyp erzeugen ...
   label2 = new JLabel("Zweites Textfeld:");
   label2.setFont(new Font("Arial",Font.BOLD,14));
   label2.setForeground(Color.blue);

   // ... und zum Frame hinzufuegen:
   frame.getContentPane().add(label2);
   
   // Textfeld2 mit Zeichentyp und -farbe erzeugen ...
   textfeld2 = new JTextField();
   textfeld2.setFont(new Font("Arial",Font.BOLD,24));
   textfeld2.setForeground(Color.red);

   // ... und zum Frame hinzufuegen:

   frame.getContentPane().add(textfeld2);

   //Ein Panel für die Checkboxen
   checkboxpanel = new JPanel();
   checkboxpanel.setBorder(BorderFactory.createEtchedBorder());
   JCheckBox checkbox1 = new JCheckBox("Textfeld 1");
   JCheckBox checkbox2 = new JCheckBox("Textfeld 2");
   
   checkboxpanel.add(checkbox1);
   checkboxpanel.add(checkbox2);

   frame.getContentPane().add(checkboxpanel);

   // Drei beschriftete Buttons erzeugen ...

   button1 = new JButton("Textfeld setzen");
   button1.setFont(new Font("Arial",Font.BOLD,24));
   button1.setForeground(Color.black);
   button2 = new JButton("Textfeld loeschen");
   button2.setFont(new Font("Arial",Font.BOLD,24));
   button2.setForeground(Color.black);
   button3 = new JButton("Quit");
   button3.setFont(new Font("Arial",Font.BOLD,24));
   button3.setForeground(Color.black);


   // ... Listener registrieren, der bei Druecken
   // des Buttons ausgefuehrt werden soll ...

   button1.addActionListener(new ButtonListener(textfeld1));
   button2.addActionListener(new ButtonListener(textfeld1));
   button1.addActionListener(new ButtonListener(textfeld2));
   button2.addActionListener(new ButtonListener(textfeld2));
   button3.addActionListener(new ButtonListener(textfeld1));
 
   // ... und zum Frame hinzufuegen:

   frame.getContentPane().add(Box.createVerticalStrut(10));
   frame.getContentPane().add(button1);
   frame.getContentPane().add(button2);
   frame.getContentPane().add(button3);
   
   // Frame sichtbar machen:

   frame.pack();
   frame.setVisible(true);

   // Position und Groeße des Frames setzen:

   frame.setLocation(100,100);
   frame.setSize(300,400);
  
  }

}

Das Problem ist in der Zeile 43. Dort versuche ich checkbox1.isSelected() abzufragen. Diese Variable ist jedoch da nicht bekannt. Fehlermeldung: cannot find symbol

checkbox1 ist in der Zeile 102 deklariert und erzeugt. Wie kann ich den jetzt in der lokalen Klasse ButtonListener auf die Variable checkbox1 und checkbox2 zugreifen??? Bitte um Hilfe, ich bekomme ja langsam kein Schlaf mehr... 😉

Viele Grüße,
Hampek
 
Hab deinen Code mal komplett umgestellt und auch sonst noch einige Kleinigkeiten geändert.

Code:
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;



public class OflDemo extends JFrame{

    private JFrame frame;              // Rahmen der Oberflaeche 
    private JLabel label1,  label2;              // fester Text 
    private JButton button1,  button2,  button3;  // Buttons 
    private JTextField textfeld1,  textfeld2;       // Feld zur Textausgabe 
    private JPanel checkboxpanel;
    private JCheckBox checkbox1;
    private JCheckBox checkbox2;
    public OflDemo() {
        //// Anweisungen zur Erzeugung der Oberflaeche: 
        super("Ein erster Frame");
        setLayout(new GridLayout(9,1));
       
        // Label1 mit Beschriftung und Zeichentyp erzeugen ... 
        label1 = new JLabel("Erstes Textfeld:");
        label1.setFont(new Font("Arial", Font.BOLD, 14));
        label1.setForeground(Color.blue);

        // ... und zum Frame hinzufuegen: 
        add(label1);

        // Textfeld1 mit Zeichentyp und -farbe erzeugen ... 
        textfeld1 = new JTextField();
        textfeld1.setFont(new Font("Arial", Font.BOLD, 24));
        textfeld1.setForeground(Color.red);

        // ... und zum Frame hinzufuegen: 
        add(textfeld1);

        // Label2 mit Beschriftung und Zeichentyp erzeugen ... 
        label2 = new JLabel("Zweites Textfeld:");
        label2.setFont(new Font("Arial", Font.BOLD, 14));
        label2.setForeground(Color.blue);

        // ... und zum Frame hinzufuegen: 
        add(label2);

        // Textfeld2 mit Zeichentyp und -farbe erzeugen ... 
        textfeld2 = new JTextField();
        textfeld2.setFont(new Font("Arial", Font.BOLD, 24));
        textfeld2.setForeground(Color.red);

        // ... und zum Frame hinzufuegen: 
        add(textfeld2);

        //Ein Panel für die Checkboxen 
        checkboxpanel = new JPanel();
        checkboxpanel.setBorder(BorderFactory.createEtchedBorder());
        checkbox1 = new JCheckBox("Textfeld 1");
        checkbox2 = new JCheckBox("Textfeld 2");

        checkboxpanel.add(checkbox1);
        checkboxpanel.add(checkbox2);

        add(checkboxpanel);

        // Drei beschriftete Buttons erzeugen ... 

        button1 = new JButton("Textfeld setzen");
        button1.setFont(new Font("Arial", Font.BOLD, 24));
        button1.setForeground(Color.black);
        
        button2 = new JButton("Textfeld loeschen");
        button2.setFont(new Font("Arial", Font.BOLD, 24));
        button2.setForeground(Color.black);
        
        button3 = new JButton("Quit");
        button3.setFont(new Font("Arial", Font.BOLD, 24));
        button3.setForeground(Color.black);

        // ... Listener registrieren, der bei Druecken 
        // des Buttons ausgefuehrt werden soll ... 
        button1.addActionListener(new ButtonListener(this));
        button2.addActionListener(new ButtonListener(this));
        button3.addActionListener(new ButtonListener(this));

        // ... und zum Frame hinzufuegen: 

        add(Box.createVerticalStrut(10));
        add(button1);
        add(button2);
        add(button3);

        // Frame sichtbar machen: 
        // Position und Groeße des Frames setzen: 

        setLocation(100, 100);
        setSize(300, 400);
       
        setVisible(true);
    }

    public JCheckBox getCheckbox1() {
        return checkbox1;
    }

    public void setCheckbox1(JCheckBox checkbox1) {
        this.checkbox1 = checkbox1;
    }

    public JCheckBox getCheckbox2() {
        return checkbox2;
    }

    public void setCheckbox2(JCheckBox checkbox2) {
        this.checkbox2 = checkbox2;
    }

    public JTextField getTextfeld1() {
        return textfeld1;
    }

    public void setTextfeld1(JTextField textfeld1) {
        this.textfeld1 = textfeld1;
    }

    public JTextField getTextfeld2() {
        return textfeld2;
    }

    public void setTextfeld2(JTextField textfeld2) {
        this.textfeld2 = textfeld2;
    }

    public static void main(String args[]) {
        new OflDemo();
    }
}
class ButtonListener implements ActionListener {

    private OflDemo ofldemo;
    
    ButtonListener(OflDemo ofldemo) {
        this.ofldemo = ofldemo;
    }

    // Operation, die beim Druecken des Buttons ausgefuehrt werden soll: 
    @Override
    public void actionPerformed(ActionEvent e) {
        
        // Ermittlung der Beschriftung des gedrueckten Buttons: 

        String buttonText = new String(((JButton) e.getSource()).getText());
        System.out.println(buttonText);
        // je nach Beschriftung Setzen oder Loeschen des Textfelds: 


        if (buttonText.equals("Textfeld setzen") && ofldemo.getCheckbox1().isSelected())  {
            ofldemo.getTextfeld1().setText("HELLO WORLD");   
        } else if (buttonText.equals("Textfeld loeschen")) {
            ofldemo.getTextfeld1().setText("");
        } else if (buttonText.equals("Quit")) {
            System.exit(0);
        }
    }
}

das ist meiner Meinung nach eine wesentlich besserer Aufbau, wobei auch der Vergleich der Strings in actionPerformed nicht ganz ideal ist. Da ist es besser die JButtons direkt zu vergleichen (entsprechende getter in der OflDemo Klasse erzeugen lassen). Auch das getContentPane hab ich entfernt, braucht man seit Ewigkeiten nicht mehr.
 
Der Tipp mit final wird nicht funktionieren, da es zum Kompilierzeitpunkt nicht bekannt ist, ob das Häckchen bei der Variablen vom Typ JCheckBox gesetzt ist oder nicht. icon_sad.gif
Mit Kompilierzeitpunkt hat das nichts zu tun. Die Checkbox ist deiner Listener-Klasse einfach nicht bekannt.

Übergib doch die Checkbox beim Erstellen der Listener mit, so wie dus auch mit den Textfeldern machst.
Also
Code:
new ButtonListener(textfeld1, checkbox1);
dann sollte das funktionieren.

Allgemein ist sowas aber auch "schöner" machbar.
 
Hallo Leute,

besten Dank für Eure Hilfe... Ich habe es endlich geschafft!!! Im Nachhinein war es sehr einfach. ;P

Wieder was dazu gelernt. 🙂

Grüße
Hampek
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben