2015-10-07 5 views
0

Pong.JavaJava Awt & Качели

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 

public class Pong { 
    private static final int WIDTH = 900, HEIGHT = 700; 
    JFrame win = new JFrame(); 
    Paddle paddleOne = new Paddle(1); 
    Paddle paddleTwo = new Paddle(2); 
    Graphics g; 

    Pong(){ 
     init(); 
    } 

    void init(){ 
     win.setTitle("PONG"); 
     win.setSize(WIDTH, HEIGHT); 
     win.addKeyListener(keyListener); 
     win.setLocationRelativeTo(null); 
     win.getContentPane().setBackground(Color.black); 
     win.setVisible(true); 
     win.getContentPane().validate(); 
     win.repaint(); 
    } 


    public void paintComponent(Graphics g){ 
     g.setColor(Color.white); 
     g.fillRect(paddleOne.getX(), paddleOne.getY(), paddleOne.getHEIGHT(), paddleOne.getWIDTH()); 

     System.out.println("drawn"); 
    } 

    KeyListener keyListener = new KeyListener() { 
     public void keyPressed(KeyEvent e) { 
      int key = e.getKeyCode(); 

      switch(key){ 
      case 87: 
       System.out.println("Player 1 Up"); 
       break; 
      case 83: 
       System.out.println("Player 1 Down"); 
       break; 
      case 38: 
       System.out.println("Player 2 Up"); 
       break; 
      case 40: 
       System.out.println("Player 2 Down"); 
       break; 
      } 

      win.getContentPane().validate(); 
      win.repaint(); 

     } 

     public void keyReleased(KeyEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

     public void keyTyped(KeyEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

    }; 

    public static void main(String[] args) { 
     Pong p = new Pong(); 
    } 
} 

Paddle.Java

public class Paddle{ 
private int WIDTH = 50, HEIGHT = 150, X, Y; 


int playerNum; 

Paddle(int playerNum){ 
    if(playerNum == 1){ 
     X = 10; 
     Y = 10; 
    }else if (playerNum == 2){ 
     X = 500; 
     Y = 10; 
    } 
} 

public void setX(int x){ 
    X = x; 
} 

public void setY(int y){ 
    Y = y; 
} 

public int getWIDTH() { 
    return WIDTH; 
} 

public int getHEIGHT() { 
    return HEIGHT; 
} 

public int getX() { 
    return X; 
} 

public int getY() { 
    return Y; 
} 

} 

Я относительно новым для программирования Java, или более конкретно AWT & Swing, что мой вопрос, почему ISN Мой рисунок прямоугольника? Любая помощь приветствуется. Спасибо огромное!

+1

'public void paintComponent (Graphics g) {' Попробуйте добавить нотацию @ @ Override .. –

+0

Метод paintComponent (Graphics) типа Pong должен переопределить или реализовать метод супертипа - это то, что он бросает на меня , – groenewoldr

+1

Так что «Понг» простирается от ничего и предполагает, что «волшебным образом» можно покрасить? Посмотрите на [Живопись в AWT и Swing] (http://www.oracle.com/technetwork/java/painting-140037.html) и [Выполнение пользовательской живописи] (http://docs.oracle.com/javase/tutorial/uiswing/painting /) для более подробной информации о том, как живопись должна работать в Swing – MadProgrammer

ответ

1

Вам необходимо переопределить paintComponents нарисовать. Вот ваш Pong.java

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class Pong { 
    private static final int WIDTH = 900, HEIGHT = 700; 
    JFrame win = new JFrame(); 
    Paddle paddleOne = new Paddle(1); 
    Paddle paddleTwo = new Paddle(2); 
    Graphics g; 

    Pong() { 
     init(); 
    } 

    void init() { 
     win.setTitle("PONG"); 
     win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     win.setSize(WIDTH, HEIGHT); 
     win.addKeyListener(keyListener); 
     win.setLocationRelativeTo(null); 
     win.add(new Panel(paddleOne)); 
     win.getContentPane().setBackground(Color.black); 
     win.setVisible(true); 
     win.getContentPane().validate(); 
     win.repaint(); 
    } 

    KeyListener keyListener = new KeyListener() { 
     public void keyPressed(KeyEvent e) { 
      int key = e.getKeyCode(); 

      switch (key) { 
      case 87: 
       System.out.println("Player 1 Up"); 
       break; 
      case 83: 
       System.out.println("Player 1 Down"); 
       break; 
      case 38: 
       System.out.println("Player 2 Up"); 
       break; 
      case 40: 
       System.out.println("Player 2 Down"); 
       break; 
      } 

      win.getContentPane().validate(); 
      win.repaint(); 

     } 

     public void keyReleased(KeyEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

     public void keyTyped(KeyEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

    }; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Pong(); 

      } 
     }); 
    } 
} 

Здесь Panel.java в котором paintComponent переопределяется.

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JPanel; 

public class Panel extends JPanel{ 
    private Paddle paddleOne; 
    public Panel(Paddle pdl) { 
     paddleOne = pdl; 
    } 

    @Override 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(Color.white); 
     g.fillRect(paddleOne.getX(), paddleOne.getY(), paddleOne.getHEIGHT(), paddleOne.getWIDTH()); 

     //System.out.println("drawn"); //Should not put something here which may overhead. 
    } 

} 
+0

Нет, это не (работает) – MadProgrammer

+0

Вы нарушили требования цепочки красок для одного. Вы действительно должны запускать пользовательский интерфейс из контекста EDT, но я бы поставил вопрос о создании фрейма из метода экземпляра панели, но это проблема дизайна, и я сомневаюсь, что ключевые события будут срабатывать надежно, пока я забивая отверстия в нем. В то время как приятно предоставить управляемое решение, вы должны привести лошадь к воде, а не засунуть голову под нее;) – MadProgrammer

+0

@MadProgrammer, хорошо? – ashiquzzaman33

1

Для того, чтобы что-то покрасить внутри в свинге, он должен простираться от чего-то свинга знать, как рисовать, это обычно означает JComponent (или более типично JPanel).

Затем вы можете переопределить один из методов рисования, который вызывается подсистемой окраски. В этом случае обычно рекомендуется переопределять paintComponent, но не забудьте позвонить super.paintComponent, прежде чем выполнять какую-либо обычную роспись, или вы «настраивая себя на какие-то странные и в целом непредсказуемые проблемы с живописью.

Посмотрите на Painting in AWT and Swing и Performing Custom Painting для более подробной информации.

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Pongo { 

    public static void main(String[] args) { 
     new Pongo(); 
    } 

    public Pongo() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new PongPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class PongPane extends JPanel { 

     private static final int WIDTH = 900, HEIGHT = 700; 
     Paddle paddleOne = new Paddle(1); 
     Paddle paddleTwo = new Paddle(2); 

     public PongPane() { 
      setBackground(Color.BLACK); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.white); 
      g.fillRect(paddleOne.getX(), paddleOne.getY(), paddleOne.getHEIGHT(), paddleOne.getWIDTH()); 

      //System.out.println("drawn"); //Should not put something here which may overhead. 
     } 

    } 

    public class Paddle { 

     private int WIDTH = 50, HEIGHT = 150, X, Y; 

     int playerNum; 

     Paddle(int playerNum) { 
      if (playerNum == 1) { 
       X = 10; 
       Y = 10; 
      } else if (playerNum == 2) { 
       X = 500; 
       Y = 10; 
      } 
     } 

     public void setX(int x) { 
      X = x; 
     } 

     public void setY(int y) { 
      Y = y; 
     } 

     public int getWIDTH() { 
      return WIDTH; 
     } 

     public int getHEIGHT() { 
      return HEIGHT; 
     } 

     public int getX() { 
      return X; 
     } 

     public int getY() { 
      return Y; 
     } 
    } 
} 

Я хотел бы также препятствовать использованию KeyListener в этом контексте и внутри советы по использованию ключевых привязок API, он не страдает от того же внимания, связанных вопросов, которые KeyListener делает. См. How to Use Key Bindings для получения более подробной информации.