2015-04-10 3 views
0

Я студент-информатик, который использует MacBook Pro середины 2009 года под управлением OS X Yosemite 10.10.3. Недавно у меня была классная деятельность в моем объектно-ориентированном классе программирования, где мы поэтапно начали создавать интерактивную программу Java, в которой пользователь просто щелкает по футболу и наблюдает за тем, как он бьет по столу с зеленым фоном.Графика Java не отображается в OS X

Однако, несмотря на то, мой Java-код соответствует коду компьютеров Windows, моим одноклассников без каких-либо ошибок синтаксиса, есть некоторые проблемы с моей программой правильно работать во время их работы прекрасно:

В то время как окна для приложения открывается название и зеленый фон, не отображаются ни футбол, ни гол. Однако, если я вручную растягиваю окно, они показывают резервную копию. Я попытался изменить размеры окна, чтобы убедиться, что это не помогло.

При нажатии на футбол, вместо того, чтобы двигаться в направлении голени, как и предполагалось, и футбол, и голландский гол исчезают и не возвращаются. Отображается только зеленый фон, даже когда я снова пытаюсь растянуть окно вручную.

Я до сих пор передавал код своему инструктору, который отлично работал на его компьютере (он не понимает проблему либо с тех пор, как не использует OS X). Я попытался запустить код на двух других IDE, чтобы увидеть, была ли проблема Eclipse, но все они дали одинаковые результаты. Если это OS X или проблема с компьютером, как я могу обойти это?

Это мой текущий код:

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


public class Football extends JFrame { 

    final int WINDOW_WIDTH = 800; 
    final int WINDOW_HEIGHT = 400; 

    private int x = 40;    // Ball's X coordinate 
    private int y = 300;    // Ball's Y coordinate 
    private final int WIDTH = 35;  // Ball's width 
    private final int HEIGHT = 60;  // Ball's height 

    private final int X_MOVE = 14;  // Pixels to move ball 
    private final int Y_MOVE = 4; 

    private final int TIME_DELAY = 25; // Time delay 
    private Timer timer;    // Timer object 

    /** 
     init method 
    */ 

    public Football() { 
     setTitle("Football"); 
     setSize(WINDOW_WIDTH, WINDOW_HEIGHT); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 

     // Set Background to a Dark Green 
     getContentPane().setBackground(new Color(0, 220, 50));   

     // initTimer(); 
     addMouseListener(new FbMouseListener()); 
    } 

    public void paint(Graphics g) 
    { 
     // Call the superclass paint method. 
     super.paint(g); 
     // Set the color to Brown 
     g.setColor(new Color(129, 74, 25)); 

     // Draw the football 
     g.fillOval(x, y, WIDTH, HEIGHT); 

     // Draw the Goalpost 
     g.setColor(Color.YELLOW); 
     g.fillRect(670, 240, 5, 140); 
     g.fillRect(610, 80, 5, 140); 
     g.fillRect(740, 120, 5, 140); 
     // Need Thicker line 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setStroke(new BasicStroke(5)); 
     g2.drawLine(612, 220, 742, 260); 
    } 

    private class TimerListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) { 
     // Update the ball's position 
     y -= Y_MOVE; 
     x += X_MOVE; 

     // Force a call to the paint method 
     repaint(); 
    } 

    } 

    public void initTimer() 
    { 
     timer = new Timer(TIME_DELAY, new TimerListener()); 
     timer.start(); 
    } 

    private class FbMouseListener implements MouseListener 
    { 
     public void mouseClicked(MouseEvent e) 
     { 
      if (e.getX() >= x && e.getX() <= (x + WIDTH) && e.getY() >= y && e.getY() <= (y + HEIGHT)) 
      { 
       initTimer(); 
      } 
     } 

     public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 

     } 

     public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 

     } 

     public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 

     } 

     public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 

     } 
    } 

    public static void main(String[] args) 
    { 
     Football fb = new Football(); 
    } 

} 

Любая помощь или предложения будут оценены, как я хотел бы, чтобы убедиться, что это не влияет на будущие программы я создаю.

+0

Как правило, перекрывая 'paint' контейнера верхнего уровня, как' JFrame' это плохая идея, 'JFrame' содержит кучу дочерних компонентов, которые могут быть окрашены независимо от родителя, который, кажется, имеет место здесь – MadProgrammer

ответ

1

Вообще, перекрывая paint из верхнего контейнера уровня, как JFrame это плохая идея, JFrame содержит кучу дочерних компонентов, которые могут быть окрашены независимо от родителя, который, кажется, дело здесь

RootPane

Как вы можете видеть, есть (по крайней мере) 3 других компонентов между рамой и пользователем

Как правило, вы должны создать пользовательский класс, который простирается от чего-то, как JPanel и переопределить это paintComponent и выполните свою обычную роспись.

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Football { 

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

    public Football() { 
     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("Football"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new FootballPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public static class FootballPane extends JPanel { 

     public static final int WINDOW_WIDTH = 800; 
     public static final int WINDOW_HEIGHT = 400; 

     private int x = 40;    // Ball's X coordinate 
     private int y = 300;    // Ball's Y coordinate 
     private static final int WIDTH = 35;  // Ball's width 
     private static final int HEIGHT = 60;  // Ball's height 

     private static final int X_MOVE = 14;  // Pixels to move ball 
     private static final int Y_MOVE = 4; 

     private static final int TIME_DELAY = 25; // Time delay 
     private Timer timer;    // Timer object 

     /** 
     * init method 
     */ 
     public FootballPane() { 

      // Set Background to a Dark Green 
      setBackground(new Color(0, 220, 50)); 

      // initTimer(); 
      addMouseListener(new FbMouseListener()); 

     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(WINDOW_WIDTH, WINDOW_HEIGHT); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      // Call the superclass paint method. 
      super.paintComponent(g); 

      // Set the color to Brown 
      g.setColor(new Color(129, 74, 25)); 

      // Draw the football 
      g.fillOval(x, y, WIDTH, HEIGHT); 

      // Draw the Goalpost 
      g.setColor(Color.YELLOW); 
      g.fillRect(670, 240, 5, 140); 
      g.fillRect(610, 80, 5, 140); 
      g.fillRect(740, 120, 5, 140); 
      // Need Thicker line 
      Graphics2D g2 = (Graphics2D) g; 
      g2.setStroke(new BasicStroke(5)); 
      g2.drawLine(612, 220, 742, 260); 
     } 

     private class TimerListener implements ActionListener { 

      public void actionPerformed(ActionEvent e) { 
       // Update the ball's position 
       y -= Y_MOVE; 
       x += X_MOVE; 

       // Force a call to the paint method 
       repaint(); 
      } 

     } 

     public void initTimer() { 
      timer = new Timer(TIME_DELAY, new TimerListener()); 
      timer.start(); 
     } 

     private class FbMouseListener implements MouseListener { 

      public void mouseClicked(MouseEvent e) { 
       if (e.getX() >= x && e.getX() <= (x + WIDTH) && e.getY() >= y && e.getY() <= (y + HEIGHT)) { 
        initTimer(); 
       } 
      } 

      public void mousePressed(MouseEvent e) { 
       // TODO Auto-generated method stub 

      } 

      public void mouseReleased(MouseEvent e) { 
       // TODO Auto-generated method stub 

      } 

      public void mouseEntered(MouseEvent e) { 
       // TODO Auto-generated method stub 

      } 

      public void mouseExited(MouseEvent e) { 
       // TODO Auto-generated method stub 

      } 
     } 

    } 

} 

См Painting in AWT and Swing и Performing Custom Painting для получения более подробной информации

+0

Спасибо, что заработало правильно. Тем не менее, мне все еще любопытно, почему одна и та же программа, которую я изначально создала, отлично работала на компьютерах с ОС Windows, но не на моем компьютере с OS X. –

+0

По существу, это была удача. Существует достаточно различий между тем, как MacOS отображает его содержимое и Windows, чтобы позволить реализации Windows избежать некоторых проблем. Вероятно, вы могли бы заставить его произойти в Windows, если вы проживали в окне ... – MadProgrammer

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