Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλημερα παιδια! Εχω ενα προβλημα στην Java. Πρεπει να φτιαξω το γνωστο sliding puzzle ως applet και οχι ως προγραμμα. Επειδη δεν πολυξερω τα applets, το βρηκα αρχικα ως JFrame και ειδα οτι ετρεχε κανονικα οπως επρεπε.

Επειτα ομως, οταν πηγα να το μεταφερω σε applet φτιαχνωντας τις μεθοδους init() και start(), μου εβγαζε error " Start: Applet not initialised ".

Ξερει κανεις μηπως τι φτιαει?

Σας παραθετω τους 2 κωδικες :

 

Ως προγραμμα :

import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

class SlidePuzzle {
    public static void main(String[] args) {
        JFrame window = new JFrame("Slide Puzzle");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setContentPane(new SlidePuzzleGUI());
        window.pack();  
        window.show();  
        window.setResizable(false);
    }
}





class SlidePuzzleGUI extends JPanel {
   private GraphicsPanel    _puzzleGraphics;
    private SlidePuzzleModel _puzzleModel = new SlidePuzzleModel();

    public SlidePuzzleGUI() {
        
        JButton newGameButton = new JButton("New Game");
        newGameButton.addActionListener(new NewGameAction());

       
        JPanel controlPanel = new JPanel();
        controlPanel.setLayout(new FlowLayout());
        controlPanel.add(newGameButton);

        
        _puzzleGraphics = new GraphicsPanel();

        
        this.setLayout(new BorderLayout());
        this.add(controlPanel, BorderLayout.NORTH);
        this.add(_puzzleGraphics, BorderLayout.CENTER);
    }


    
class GraphicsPanel extends JPanel implements MouseListener {
        private static final int ROWS = 3;
        private static final int COLS = 3;
        private static final int CELL_SIZE = 80; // Pixels
        private Font _biggerFont;

        public GraphicsPanel() {
            _biggerFont = new Font("SansSerif", Font.BOLD, CELL_SIZE/2);
            this.setPreferredSize(new Dimension(CELL_SIZE * COLS, CELL_SIZE*ROWS));
            this.setBackground(Color.black);
            this.addMouseListener(this);
        }


        
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            for (int r=0; r<ROWS; r++) {
                for (int c=0; c<COLS; c++) {
                    int x = c * CELL_SIZE;
                    int y = r * CELL_SIZE;
                    String text = _puzzleModel.getFace(r, c);
                    if (text != null) {
                        g.setColor(Color.gray);
                        g.fillRect(x+2, y+2, CELL_SIZE-4, CELL_SIZE-4);
                        g.setColor(Color.black);
                        g.setFont(_biggerFont);
                        g.drawString(text, x+20, y+(3*CELL_SIZE)/4);
                    }
                }
            }
        }


        
        public void mousePressed(MouseEvent e) {
            //--- map x,y coordinates into a row and col.
            int col = e.getX()/CELL_SIZE;
            int row = e.getY()/CELL_SIZE;

            if (!_puzzleModel.moveTile(row, col)) {
                // moveTile moves tile if legal, else returns false.
                Toolkit.getDefaultToolkit().beep();
            }

            this.repaint();  
        }


        
        public void mouseClicked (MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered (MouseEvent e) {}
        public void mouseExited  (MouseEvent e) {}
    }

    
    public class NewGameAction implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            _puzzleModel.reset();
            _puzzleGraphics.repaint();
        }
    }

}






class SlidePuzzleModel {
    private static final int ROWS = 3;
    private static final int COLS = 3;

    private Tile[][] _contents;  
    private Tile     _emptyTile;

    public SlidePuzzleModel() {
        _contents = new Tile[ROWS][COLS];
        reset();            
    }


    String getFace(int row, int col) {
        return _contents[row][col].getFace();
    }

    public void reset() {
        for (int r=0; r<ROWS; r++) {
            for (int c=0; c<COLS; c++) {
                _contents[r][c] = new Tile(r, c, "" + (r*COLS+c+1));
            }
        }
       
        _emptyTile = _contents[ROWS-1][COLS-1];
        _emptyTile.setFace(null);

        for (int r=0; r<ROWS; r++) {
            for (int c=0; c<COLS; c++) {
                exchangeTiles(r, c, (int)(Math.random()*ROWS)
                                  , (int)(Math.random()*COLS));
            }
        }
    }


    public boolean moveTile(int r, int c) {
        
        return checkEmpty(r, c, -1, 0) || checkEmpty(r, c, 1, 0)
            || checkEmpty(r, c, 0, -1) || checkEmpty(r, c, 0, 1);
    }


    private boolean checkEmpty(int r, int c, int rdelta, int cdelta) {
        int rNeighbor = r + rdelta;
        int cNeighbor = c + cdelta;
        
        if (isLegalRowCol(rNeighbor, cNeighbor)
                  && _contents[rNeighbor][cNeighbor] == _emptyTile) {
            exchangeTiles(r, c, rNeighbor, cNeighbor);
            return true;
        }
        return false;
    }

    public boolean isLegalRowCol(int r, int c) {
        return r>=0 && r<ROWS && c>=0 && c<COLS;
    }


    private void exchangeTiles(int r1, int c1, int r2, int c2) {
        Tile temp = _contents[r1][c1];
        _contents[r1][c1] = _contents[r2][c2];
        _contents[r2][c2] = temp;
    }


    
    public boolean isGameOver() {
        for (int r=0; r<ROWS; r++) {
            for (int c=0; c<ROWS; c++) {
                Tile trc = _contents[r][c];
                return trc.isInFinalPosition(r, c);
            }
        }
        return true;
    }
}


class Tile {
 
    private int _row;     
    private int _col;     
    private String _face;  
    
   public Tile(int row, int col, String face) {
        _row = row;
        _col = col;
        _face = face;
    }

   public void setFace(String newFace) {
        _face = newFace;
    }


   public String getFace() {
        return _face;
    }


    public boolean isInFinalPosition(int r, int c) {
       return r==_row && c==_col;
   }
}

Ως applet :

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.applet.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;

class SlidePuzzleGUI extends JApplet {
    
private GraphicsPanel _puzzleGraphics;
private SlidePuzzleModel _puzzleModel = new SlidePuzzleModel();
   
JPanel controlPanel = new JPanel();

    
    public SlidePuzzleGUI() {
       
        JButton newGameButton = new JButton("New Game");
        newGameButton.addActionListener(new NewGameAction());

        

        controlPanel.setLayout(new FlowLayout());
        controlPanel.add(newGameButton);

        
        _puzzleGraphics = new GraphicsPanel();

        
        this.setLayout(new BorderLayout());
        this.add(controlPanel, BorderLayout.NORTH);
        this.add(_puzzleGraphics, BorderLayout.CENTER);
    }


   
    class GraphicsPanel extends JPanel implements MouseListener {
        private static final int ROWS = 3;
        private static final int COLS = 3;

        private static final int CELL_SIZE = 80; // Pixels
        private Font _biggerFont;


        
        public GraphicsPanel() {
            _biggerFont = new Font("SansSerif", Font.BOLD, CELL_SIZE/2);
            this.setPreferredSize(
            new Dimension(CELL_SIZE * COLS, CELL_SIZE*ROWS));
            this.setBackground(Color.black);
            this.addMouseListener(this);
        }


        
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            for (int r=0; r<ROWS; r++) {
                for (int c=0; c<COLS; c++) {
                    int x = c * CELL_SIZE;
                    int y = r * CELL_SIZE;
                    String text = _puzzleModel.getFace(r, c);
                    if (text != null) {
                        g.setColor(Color.gray);
                        g.fillRect(x+2, y+2, CELL_SIZE-4, CELL_SIZE-4);
                        g.setColor(Color.black);
                        g.setFont(_biggerFont);
                        g.drawString(text, x+20, y+(3*CELL_SIZE)/4);
                    }
                }
            }
        }


       
        public void mousePressed(MouseEvent e) {
            //--- map x,y coordinates into a row and col.
            int col = e.getX()/CELL_SIZE;
            int row = e.getY()/CELL_SIZE;

            if (!_puzzleModel.moveTile(row, col)) {
                // moveTile moves tile if legal, else returns false.
                Toolkit.getDefaultToolkit().beep();
            }

            this.repaint();  
        }


        
        public void mouseClicked (MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered (MouseEvent e) {}
        public void mouseExited  (MouseEvent e) {}
    }
   
    public class NewGameAction implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            _puzzleModel.reset();
            _puzzleGraphics.repaint();
        }
    }
public void init()
{
System.out.println("Applet initializing");
SlidePuzzleGUI d = new SlidePuzzleGUI();
controlPanel.add(d);
}

public void start() {
System.out.println("Applet starting");
}

public void stop() {
System.out.println("Applet stopping");
}

public void destroy() {
System.out.println("Applet destroyed");
}

public static void main(String args[]){
JFrame frame = new JFrame("Code Converter");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SlidePuzzleGUI a = new SlidePuzzleGUI();
a.init();
frame.setContentPane(new SlidePuzzleGUI());
frame.pack();
frame.show();

}
}

Υ.Γ

 

Eψαξα λιγο στο Internet για το error που μου εβγαζε και ειδα οτι σε αρκετους κωδικες δεν ειχε αρχικοποιηθει η μεταβλητη στην μεθοδο init(). Δεν ξερω κατα ποσο ισχυει και σε μενα αυτο καθως το SlidePuzzleGUI το αρχικοποιω μεσα στην init().

Δημοσ.

Eπειδη εισαι και αρχοντας, θελω να σε ρωτησω και κατι ακομα. Επρεπε επισης να εχω εναν μετρητη moves ο οποιος για καθε φορα που εκανες μια κινηση αυξανοταν και θα επρεπε να εμφανιζεται στο κατω μερος του πανελ \ applet. Δοκιμασα να το κανω με ενα label και διπλα τον μετρητη, χρησιμοποιωντας την μεθοδο getClickCount() της MouseEvent. Το προβλημα ηταν δεν εμφανιζοταν τιποτα.Πιο συγκεκριμενα ειχα κανει τις δηλωσεις αυτες στην πρωτη κλαση SlidePuzzleGUI :

static int moves = 0; 
Label movesTaken;

και επειτα ειχα κανει το εξης :

 

public void mouseClicked (MouseEvent e) 

{
           moves++;
           movesTaken.setText("Moves taken : " + moves);

}

αλλα δεν εμφανιζοταν τιποτα. Το ιδιο εγινε και οταν εβαλα System.out.println αντι για movesTaken.setText.

 

Eχεις καμια ιδεα για τι τι φταιει?

 

Υ.Γ : Στο JPanel (1ος κωδικας) που εκανα ακριβως τα ιδια, εμφανιζοταν στο terminal συνεχως μια τιμη 1 καθε φορα που παταγα ενα κλικ. Σκεφτηκα να βαλω μια επαναληψη αλλα δεν ειχα ιδεα ποτε θα τερματιζει.

Δημοσ.

Επειδη δε καταλαβαινω οπως τα γραφεις, θα προτιμουσα να εβαζες ολοκληρο το κωδικα που εγραψες.

Εισαι σιγουρος πως αρχικοποιεις το label σωστα; Αν του βαλεις αρχικη τιμη εμφανιζεται πουθενα;

Δημοσ.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.applet.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;


public class SlidePuzzleGUI extends JApplet {
    
private GraphicsPanel _puzzleGraphics;
private SlidePuzzleModel _puzzleModel = new SlidePuzzleModel();
static int moves = 0;
Label movesTaken;
   
JPanel controlPanel = new JPanel();


    
    public SlidePuzzleGUI() {
       
        JButton newGameButton = new JButton("New Game");
        newGameButton.addActionListener(new NewGameAction());


        


        controlPanel.setLayout(new FlowLayout());
        controlPanel.add(newGameButton);
        //controlPanel.add(movesTaken);


        
        _puzzleGraphics = new GraphicsPanel();


        
        this.setLayout(new BorderLayout());
        this.add(controlPanel, BorderLayout.NORTH);
        this.add(_puzzleGraphics, BorderLayout.CENTER);
    }




   
    class GraphicsPanel extends JPanel implements MouseListener {
        private static final int ROWS = 3;
        private static final int COLS = 3;


        private static final int CELL_SIZE = 80; // Pixels
        private Font _biggerFont;




        
        public GraphicsPanel() {
            _biggerFont = new Font("SansSerif", Font.BOLD, CELL_SIZE/2);
            this.setPreferredSize(
            new Dimension(CELL_SIZE * COLS, CELL_SIZE*ROWS));
            this.setBackground(Color.black);
            this.addMouseListener(this);
        }




        
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            for (int r=0; r<ROWS; r++) {
                for (int c=0; c<COLS; c++) {
                    int x = c * CELL_SIZE;
                    int y = r * CELL_SIZE;
                    String text = _puzzleModel.getFace(r, c);
                    if (text != null) {
                        g.setColor(Color.gray);
                        g.fillRect(x+2, y+2, CELL_SIZE-4, CELL_SIZE-4);
                        g.setColor(Color.black);
                        g.setFont(_biggerFont);
                        g.drawString(text, x+20, y+(3*CELL_SIZE)/4);
                    }
                }
            }
        }




       
        public void mousePressed(MouseEvent e) {
            //--- map x,y coordinates into a row and col.
            int col = e.getX()/CELL_SIZE;
            int row = e.getY()/CELL_SIZE;


            if (!_puzzleModel.moveTile(row, col)) {
                // moveTile moves tile if legal, else returns false.
                Toolkit.getDefaultToolkit().beep();
            }


            this.repaint();  
        }




        
        public void mouseClicked (MouseEvent e) {
           moves++;
           System.out.println("Moves taken : " + moves);
       }
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered (MouseEvent e) {}
        public void mouseExited  (MouseEvent e) {}
    }
   
    public class NewGameAction implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            _puzzleModel.reset();
            _puzzleGraphics.repaint();
        }
    }
public void init() 
{ 
System.out.println("Applet initializing");
}


public void start() {
System.out.println("Applet starting");
}


public void stop() {
System.out.println("Applet stopping");
}


public void destroy() {
System.out.println("Applet destroyed");
}


public static void main(String args[]){
JFrame frame = new JFrame("Code Converter");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SlidePuzzleGUI a = new SlidePuzzleGUI();
a.init();
frame.setContentPane(new SlidePuzzleGUI());
frame.pack();
frame.show();


}
}

Η εντολη controlPanel.add(movesTaken); στον 1ο constructor ειναι ως σχολιο γιατι η προσθηκη της μου εβγαζε παλι "Start:Applet not initialised"

Δημοσ.
  Στις 25/5/2014 στις 10:59 ΜΜ, vagg77 είπε
Η εντολη controlPanel.add(movesTaken); στον 1ο constructor ειναι ως σχολιο γιατι η προσθηκη της μου εβγαζε παλι "Start:Applet not initialised"

Ναι γιατι δεν εχεις αρχικοποιησει την movesTaken (δηλαδη ειναι null τη στιγμη που την κανεις add)

 

Επισης, from logic point of view δεν ειναι σωστο να αυξανεις την moves σε καθε mouseClicked. Ουσιαστικα θες να αυξανεται καθε φορα που μετακινειται ενα tile (hint δηλαδη οταν η _puzzleModel.moveTile επιστρεφει...... κατι).

Δημοσ.

Λοιπον, καταφερα και εβαλα το label  για τα moves κατω κατω οπως ηθελα, αλλα η moves δεν λεει να φυγει απο το 0.Δοκιμασα να βαλω μια super(moves); στην public GraphicsPanel() αλλα μου εβγαλε error συσχετιζομενο με το JPanel και την super(int).

 

Με ποιον τροπο εγω τωρα θα "κληρονομω" την τιμη της moves αρχικά??

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.applet.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;


public class SlidePuzzleGUI extends JApplet {
    
private GraphicsPanel _puzzleGraphics;
private SlidePuzzleModel _puzzleModel = new SlidePuzzleModel();
static int moves = 0;
Label movesTaken = null;
   
JPanel controlPanel = new JPanel();
JPanel controlPanel2 = new JPanel();


    
    public SlidePuzzleGUI() {
       
        JButton newGameButton = new JButton("New Game");
        newGameButton.addActionListener(new NewGameAction());
        movesTaken = new Label("Moves:"+moves);


        


        controlPanel.setLayout(new FlowLayout());
        controlPanel.add(newGameButton);
        controlPanel2.add(movesTaken);


        
        _puzzleGraphics = new GraphicsPanel();


        
        this.setLayout(new BorderLayout());
        this.add(controlPanel, BorderLayout.NORTH);
        this.add(controlPanel2, BorderLayout.SOUTH);
        this.add(_puzzleGraphics, BorderLayout.CENTER);
    }




   
    class GraphicsPanel extends JPanel implements MouseListener {
        private static final int ROWS = 3;
        private static final int COLS = 3;


        private static final int CELL_SIZE = 80; // Pixels
        private Font _biggerFont;




        
        public GraphicsPanel() {
           // super(moves);
            _biggerFont = new Font("SansSerif", Font.BOLD, CELL_SIZE/2);
            this.setPreferredSize(
            new Dimension(CELL_SIZE * COLS, CELL_SIZE*ROWS));
            this.setBackground(Color.black);
            this.addMouseListener(this);
        }




        
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            for (int r=0; r<ROWS; r++) {
                for (int c=0; c<COLS; c++) {
                    int x = c * CELL_SIZE;
                    int y = r * CELL_SIZE;
                    String text = _puzzleModel.getFace(r, c);
                    if (text != null) {
                        g.setColor(Color.gray);
                        g.fillRect(x+2, y+2, CELL_SIZE-4, CELL_SIZE-4);
                        g.setColor(Color.black);
                        g.setFont(_biggerFont);
                        g.drawString(text, x+20, y+(3*CELL_SIZE)/4);
                    }
                }
            }
        }




       
        public void mousePressed(MouseEvent e) {
            
            //--- map x,y coordinates into a row and col.
            int col = e.getX()/CELL_SIZE;
            int row = e.getY()/CELL_SIZE;


            if (!_puzzleModel.moveTile(row, col)) {
                // moveTile moves tile if legal, else returns false.
                Toolkit.getDefaultToolkit().beep();
               
            }
            moves++;
            this.repaint();  
        }




        
        public void mouseClicked (MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered (MouseEvent e) {}
        public void mouseExited  (MouseEvent e) {}
    }
   
    public class NewGameAction implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            _puzzleModel.reset();
            _puzzleGraphics.repaint();
        }
    }
public void init() 
{ 
System.out.println("Applet initializing");
}


public void start() {
System.out.println("Applet starting");
}


public void stop() {
System.out.println("Applet stopping");
}


public void destroy() {
System.out.println("Applet destroyed");
}


public static void main(String args[]){
JFrame frame = new JFrame("Code Converter");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SlidePuzzleGUI a = new SlidePuzzleGUI();
a.init();
frame.setContentPane(new SlidePuzzleGUI());
frame.pack();
frame.show();


}
}
Δημοσ.

Η moves αλλαζει, το text του label οχι.....

Μετα απο καθε αλλαγη της τιμης της moves πρεπει να ενημερωνεις το text του label.

Στη περιπτωση σου, μετα το

moves++

 βαλε ενα 

movesTaken.setText("Moves:" + moves);
  • 4 εβδομάδες αργότερα...

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...