vagg77 Δημοσ. 23 Μαΐου 2014 Δημοσ. 23 Μαΐου 2014 Καλημερα παιδια! Εχω ενα προβλημα στην 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().
georgemarios Δημοσ. 23 Μαΐου 2014 Δημοσ. 23 Μαΐου 2014 1) αδειασε την init (ασε το System.out.println αν το θες) 2) κανε την SlidePuzzleGUI public δηλ public class SlidePuzzleGUI extends JApplet { // και λοιπα
vagg77 Δημοσ. 25 Μαΐου 2014 Μέλος Δημοσ. 25 Μαΐου 2014 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 καθε φορα που παταγα ενα κλικ. Σκεφτηκα να βαλω μια επαναληψη αλλα δεν ειχα ιδεα ποτε θα τερματιζει.
georgemarios Δημοσ. 25 Μαΐου 2014 Δημοσ. 25 Μαΐου 2014 Επειδη δε καταλαβαινω οπως τα γραφεις, θα προτιμουσα να εβαζες ολοκληρο το κωδικα που εγραψες. Εισαι σιγουρος πως αρχικοποιεις το label σωστα; Αν του βαλεις αρχικη τιμη εμφανιζεται πουθενα;
vagg77 Δημοσ. 26 Μαΐου 2014 Μέλος Δημοσ. 26 Μαΐου 2014 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"
georgemarios Δημοσ. 26 Μαΐου 2014 Δημοσ. 26 Μαΐου 2014 Στις 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 επιστρεφει...... κατι).
vagg77 Δημοσ. 27 Μαΐου 2014 Μέλος Δημοσ. 27 Μαΐου 2014 Λοιπον, καταφερα και εβαλα το 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(); } }
georgemarios Δημοσ. 27 Μαΐου 2014 Δημοσ. 27 Μαΐου 2014 Η moves αλλαζει, το text του label οχι..... Μετα απο καθε αλλαγη της τιμης της moves πρεπει να ενημερωνεις το text του label. Στη περιπτωση σου, μετα το moves++ βαλε ενα movesTaken.setText("Moves:" + moves);
vagg77 Δημοσ. 27 Μαΐου 2014 Μέλος Δημοσ. 27 Μαΐου 2014 οκ ολα κομπλε..............Ευχαριστω παρα παρα παρα πολυ!!!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα