Obsługa zdarzeń w klasie zewnętrznej

0

Jak w temacie - chcę obsłużyć zdarzenie w klasie zewnętrznej. Wydaje mi się, że napisany kod jest poprawny, a jednak program nie działa jak powinien. W przypadku obsługi w klasie wewnętrznej wszystko działa jak należy... Proszę o wskazówki, co powinnam zmienić/dodać w klasie zewnętrznej.

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;


public class MojApplet extends Applet {

	boolean italics = false,
			bold = false;
	
	CheckboxGroup checkboxgroup;
    Checkbox checkbox5, checkbox6, checkbox1, checkbox2;
    Button button;
    
    int rozmiar = 10,
    	rodzaj = 0;
    String czcionka = new String("Times New Roman");
    Font appFont = new Font(czcionka, rodzaj, rozmiar); // poczatkowy stan napisu
    String text = new String ("TEKST probny JAVA");
    Color color = Color.black;
    
    Wewnetrzna wewnetrzna;
    Zewnetrzna zewnetrzna;
    
    public void paint (Graphics g) {
    	
    	setSize(500,200);
    	
    	// 0-PLAIN, 1-BOLD, 2-ITALICS
    	if ((italics==true) && (bold==true)) rodzaj=3;
    	if ((italics==true) && (bold==false)) rodzaj=2;
    	if ((italics==false) && (bold==true)) rodzaj=1;
    	if ((italics==false) && (bold==false)) rodzaj=0;
    	
    	appFont = new Font(czcionka, rodzaj, rozmiar);
    	g.setFont(appFont);
    	g.setColor(color);
    	g.drawString(text, 30, 100);
    	g.drawString(Integer.toString(rozmiar),30,150);
    }

    public void init(){
    		
            checkbox5 = new Checkbox("Italic");
            checkbox6 = new Checkbox("Bold");
            
            checkboxgroup = new CheckboxGroup();
            checkbox1 = new Checkbox("18", false, checkboxgroup);
            checkbox2 = new Checkbox("36", false, checkboxgroup);
            
            button = new Button("Kliknij");
            
            wewnetrzna = new Wewnetrzna();
            zewnetrzna = new Zewnetrzna(checkbox1, checkbox2, rozmiar, button);
            
            
            checkbox5.addItemListener(wewnetrzna);
            checkbox6.addItemListener(wewnetrzna);
            checkbox1.addItemListener(zewnetrzna);
            checkbox2.addItemListener(zewnetrzna);
            button.addActionListener(zewnetrzna);
            
            add(checkbox5);
            add(checkbox6); 
            add(checkbox1);
            add(checkbox2);
            add(button);
    }
    
    public class Wewnetrzna implements ItemListener {

    	public void itemStateChanged (ItemEvent e) {

    		if(e.getSource() == checkbox5){
            	italics = !italics;
            }
            
            if(e.getItemSelectable() == checkbox6){
            	bold = !bold;
            }
            repaint();
    	}
    }
}

class Zewnetrzna extends Applet implements ItemListener, ActionListener {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	Checkbox checkbox1, checkbox2;
	int rozmiar;
	Button button;
	
	public Zewnetrzna (Checkbox checkbox1, Checkbox checkbox2, int rozmiar, Button button) {
		this.checkbox1 = checkbox1;
		this.checkbox2 = checkbox2;
		this.rozmiar = rozmiar;
		this.button = button;
	}

	@Override
	public void itemStateChanged(ItemEvent e) {
		// TODO Auto-generated method stub
		if(e.getSource() == checkbox1){
        	rozmiar = 18;
        }
        
        if(e.getItemSelectable() == checkbox2){
        	rozmiar = 36;
        }
        repaint();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if (e.getSource()== button)
			rozmiar = 18;
		repaint();
	}
}
0
  1. rozmiar jest LOKALNY u Ciebie -> nie przekazujesz referencji tylko wartość (bo przekazujesz int a nie Integer) -> ponadto Integer może być unmodifiable (nie chce mi się sprawdzać), więc nie zmienisz jego wartości tak, żeby była ta zmiana widoczna na zewnątrz
  2. jak myślisz, dla którego obiektu wywołujesz repaint() ? :>
0
  1. dlaczego klasa Zewnetrzna dziedziczy po klasie Applet?
    Typowe rozwiązanie problemu, to przekazanie do klasy Zewnetrzna referencji do klasy głównej.
...
zewnetrzna = new Zewnetrzna(this);
...
class Zewnetrzna implements ItemListener, ActionListener {
    private MojApplet aplet;
 
    public Zewnetrzna (MojApplet aplet) {
        this.aplet = aplet;
    }
 
    @Override
    public void itemStateChanged(ItemEvent e) {
        if(e.getSource() == aplet.checkbox1){
            aplet.rozmiar = 18;
        }
 
        if(e.getItemSelectable() == aplet.checkbox2){
            aplet.rozmiar = 36;
        }
        aplet.repaint();
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource()== aplet.button){
            aplet.rozmiar = 18;
            aplet.repaint();
        }
    }
}
0

Ok, rozumiem już jakie błędy tu były - dzięki za odpowiedzi. Po poprawie wszystko działa jak powinno ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1