2015-10-07 2 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 для получения более подробной информации.

 Смежные вопросы

  • Нет связанных вопросов^_^