klasy i private klasy i JButton:/

0

Witam niemoge skompilowac tego programiku bo kompilator pokazuje mi blad:"local variable k is accessed from within inner class; needs to be declared final"

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class grafa extends JFrame
{
	public static void main(String argv[])
	{
		grafa p=new grafa();
		p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		p.setVisible(true);
		
	}
	
	public grafa()
	{
	
		setSize(200,300);
		setTitle("zmiana tla");
		Container zawartosc=getContentPane();
		tlo k=new tlo();
		JButton pierwszy=new JButton("1");
		JButton drugi=new JButton("2");
		zawartosc.add(k,BorderLayout.EAST);
		zawartosc.add(pierwszy,BorderLayout.WEST);
		zawartosc.add(drugi,BorderLayout.CENTER);
		
		pierwszy.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent zdarzenie)
			{
				
				JOptionPane.showMessageDialog(null,"cos tu 1");
				k.spr=false;
				//k.repaint();
			}
		});
		
		drugi.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent zdarzenie)
			{
				JOptionPane.showMessageDialog(null,"cos tu 2");
				k.spr=true;
				//k.repaint();
			}
		});
	}
	
	private class tlo extends JPanel
	{
		boolean spr=false;
        public void paintComponent(Graphics g)
        {
        	if(spr)
            {
            	g.setColor(Color.RED);
                g.fillRect(50,5,50,50);
            }
            else
            {
            	g.setColor(Color.BLUE);
                g.fillOval(50,3,50,50);
            }
            
		}
	}

}

zmienilem i dziala ale niewiem dlaczego tak powinienem zmienic?

tlo k;	
	public grafa()
	{
	
		setSize(200,300);
		setTitle("zmiana tla");
		Container zawartosc=getContentPane();
		k=new tlo();
		JButton pierwszy=new JButton("1");
		JButton drugi=new JButton("2");
		zawartosc.add(k,BorderLayout.CENTER);
		zawartosc.add(pierwszy,BorderLayout.NORTH);
		zawartosc.add(drugi,BorderLayout.SOUTH);
		
		pierwszy.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent zdarzenie)
			{
				k.spr=true;
				k.repaint();
			}
		});
		
		drugi.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent zdarzenie)
			{
				k.spr=false;
				k.repaint();
			}
		});
		
	}
	

chodzi o to tlo k;

0

no przeciez dostałes komunikat: że aby mieć dostęp do zmiennej k z anonimowej klasy wewnętrznej, to zmienna k musi byc finalna, tak jest i juz.
albo trzeba zrobic tak jak Ty to zrobiłeś, wywalić zmienna z konstruktora i niech stanie się ona atrubutem klasy. Taka jest specyfikacja i tyle, wyżej niektórych rzeczy nie podskoczysz.

pzdr.

0

ok thx za odp

pozdr.

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