Gå til innhold

Problem med "cannot make a static reference to the non-static method"


Anbefalte innlegg

Har et lite problem jeg trenger hjelp til. Legger ikke ut koden riktig enda da en egentlig ikke trengs for å løse problemet.

 

Problemet har seg slik at jeg har en abstract klasse (extends JFrame) som har en indre static klasse (extends JPanel). Inne i den indre klassen har jeg en metode med en parameter. Denne skal jeg måtte kalle fra en helt annen klasse slik at jeg kan sende med parameter variabelen. Hvordan gjør jeg dette? Får som sagt feilen som skrevet i topic "Cannot make a static refrence to the non-static method tegnbrett(Sudokubrett) from the type SudokuGUI.Sudokupanel

 

Det jeg altså gjør er SudokuGUI.SudokuPanel.tegnBrett(brettet); når jeg kaller på metoden.

 

Hjelp? :D

Lenke til kommentar
Videoannonse
Annonse

Er klar over det. Grunnen til at jeg ikke legger den ut er at det er masse kode som ikke er relevant for probelemet. Hadde lagt ut koden før jeg endret posten min.

 

Løsningen var enkel. Man kan jo ikke lage nye objekter av en abstract klasse, så jeg måtte lage en subklasse som extender den abstracte klassen. Denne subklassen laget en ramme for et GUI (JFrame). I den abstrakte klassen er det dessuten en underklasse som er static. Denne skal fungere som et JPanel. Jeg sier new JPanel i subklassen til den ytre klassen, og sender dermed denne som parameter til en annen klasse slik at jeg får tilgang til static klassen og får dermed tilgang til den :) Vanskelig forklart kanskje. Legger ut koden i tillegg straks.

 

abstract class SudokuGUI extends JFrame { //dette er utsyn
protected SudokuBuffer buffer;
protected SudokuArbeider arbeider;

/**The GUI needs a buffer to read solutions from.
 * 
 * @param buffer
 */
public SudokuGUI(SudokuBuffer buffer) {
	this.buffer = buffer;
	buffer.setUtsyn(this);
}
SudokuGUI(){

}

/**Sets the "next" button to be active, i.e. receptive to user interaction.
 */
public abstract void settAktiv();

/**Sets the "next" button to be inactive, i.e. not receptive to user interaction.
 */
public abstract void settInaktiv();

/**Draws the Sudoku board represented by a <tt>char[][]</tt> in a JPanel.
 * 
 * @author jonmv
 */
protected static class SudokuPanel extends JPanel { //static
	private static final long serialVersionUID = -1;	//Nothing to care about...
	private static final int DEFAULT_SIZE = 40;		//Default square size.
	private int dim, hoyde, bredde;				   	//Dimentions of current board.
	private JLabel[][] ruter;				//The labels containing the board values.

	protected SudokuPanel() {
		settOppBrett(9, 3, 3);
		setDoubleBuffered(true);
		setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
	}

	/**Draws the Sudoku puzzle solution represented by the <tt>char[][]</tt> in the Sudokubrett parameter. 
	 * 
	 * @param brett
	 */
	protected void tegnBrett(Sudokubrett brett) {
		if (brett.hoyde != hoyde || brett.bredde != bredde) {
			settOppBrett(brett.dimensjon, brett.hoyde, brett.bredde);
		}
		for (int i = 0; i < dim; i++)
			for (int j = 0; j < dim; j++) {
				ruter[i][j].setText(brett.brett[i][j] + "");
			}
	}

	/**Rearranges the panel with inner panels and labels with the correct layout.
	 * 
	 * @param dim
	 * @param hoyde
	 * @param bredde
	 */
	private void settOppBrett(int dim, int hoyde, int bredde) {
		removeAll();
		this.dim = dim;
		this.hoyde = hoyde;
		this.bredde = bredde;
		this.setLayout(new GridLayout(bredde, hoyde));

		JPanel[][] bokser = new JPanel[bredde][hoyde];
		for (int i = 0; i < bredde; i++)
			for (int j = 0; j < hoyde; j++) {
				JPanel boks = new JPanel();
				boks.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
				boks.setLayout(new GridLayout(hoyde, bredde));
				boks.setOpaque(false);
				bokser[i][j] = boks;
				add(boks);
			}
		ruter = new JLabel[dim][dim];
		for (int i = 0; i < dim; i++)
			for (int j = 0; j < dim; j++) {
				JLabel label = new JLabel();
				label.setHorizontalAlignment(SwingConstants.CENTER);
				label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
				label.setPreferredSize(new Dimension(DEFAULT_SIZE, DEFAULT_SIZE));
				ruter[i][j] = label;
				bokser[i / hoyde][j / bredde].add(label);
			}
	}
}
}

class Brukergrensesnittet extends SudokuGUI {
private static final long serialVersionUID = -1;
JButton startKnapp;;
JButton stoppKnapp;
JButton nesteKnapp;

public void settAktiv(){ 

}
public void settInaktiv(){

}

Brukergrensesnittet() {
	setTitle("Sudokuhjelper");
	SudokuPanel panel = new SudokuPanel();
	startKnapp = new JButton("Start");
	stoppKnapp = new JButton("Stopp");
	nesteKnapp = new JButton("Neste løsning");
	Container lerret = getContentPane();
	lerret.setLayout(new BorderLayout());
	lerret.add(panel, BorderLayout.NORTH);
	lerret.add(startKnapp, BorderLayout.WEST);
	lerret.add(stoppKnapp, BorderLayout.CENTER);
	lerret.add(nesteKnapp, BorderLayout.EAST);
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	pack();
	setVisible(true);
	ActionListener knappelytter = new Lytter(panel);
	startKnapp.addActionListener(knappelytter);
	stoppKnapp.addActionListener(knappelytter);
	nesteKnapp.addActionListener(knappelytter);
}
class Lytter implements ActionListener {
	SudokuPanel panel;
	Lytter (SudokuPanel panel) {
		this.panel = panel;
	}
	public void actionPerformed(ActionEvent e){
		if (e.getSource() == startKnapp) {
			JFileChooser chooser = new JFileChooser();
			int valg = chooser.showOpenDialog(null);
			if(valg == JFileChooser.APPROVE_OPTION) {
				String filnavn = chooser.getSelectedFile().getName();
				System.out.println("Du har valgt å åpne fila: " + chooser.getSelectedFile().getName());
				try {
					Sudokubrett brettet = Sudokubrett.lesFraFil(filnavn); //returnerer et sudokubrett
					panel.tegnBrett(brettet);
				}
				catch (FileNotFoundException f){
				} 
				catch (IOException f){
				}
			}
		} else if (e.getSource() == stoppKnapp){
			System.out.println("Programmet skal stoppe å finne løsninger");
		} else if (e.getSource() == nesteKnapp){
			System.out.println("Programmet finner neste løsningen");
		}
	}
}
}

Endret av Benbjo
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...