2011-07-13 8 views
3

Canvasを拡張しているDisplayクラスを考えると問題が残っています。 非常に同じクラス内で1つのスレッドが実行されています。 このスレッドでは、repaintメソッドが呼び出されます。 しかし、スレッドが正常に動作している間は、paintメソッドは呼び出されません。ここで私の再塗装はなぜ機能しないのですか?

は(私は無関係なすべてのものを残し)私のコードです:

package display; 

public final class Display extends Canvas implements Runnable { 
private static final long serialVersionUID = 1L; 

private Frame frame; 

private GraphicsEnvironment ge; 
private GraphicsDevice gd; 

public BDisplay() {  
    ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    gd = ge.getDefaultScreenDevice(); 

    frame = new Frame(); 

    //frame.setUndecorated(true); 
    frame.setLocationRelativeTo(null); 
    frame.setResizable(false); 
    frame.setVisible(true); 

    frame.add(this); 

    frame.setLayout(null); 

    //gd.setFullScreenWindow(frame); 
} 

@Override 
public final void paint(Graphics g) { 
    //THIS METHOD IS NEVER CALLED 

    System.out.println("Paint method was called!"); 
    super.paint(g); 

    //... 
} 

@Override 
public synchronized void run() { 
    while (isRunning()) { 
     //THIS LOOP WORKS FINE. 
     this.repaint(); 
    } 
} 
} 

それは)isRunning(のようないくつか欠けている機能とは何の関係もありません。 彼らは存在する、私はそれらを残しました。

これまでのような問題を偶然見つけたことはありませんでしたが、今はSWINGやAWTで何もしていませんが、 です。

誰でも手助けできますか?

糸ループは現在、正常に動作します が、再描画だけで、スケジュールを取得していないようです...

+0

ここで達成しようとしていることは非常に奇妙なことです。 – dhblah

+0

isRunning()がループ内で連続的に実行されているかどうかを知ることができます(;-))。それで他のスレッドがスケジュールされないようにしています – jogabonito

+0

質問: 'Canvas'を使用するのはなぜですか?JPanel – mKorbel

答えて

3

を使用することによってあなたはコンポーネント(すなわちCanvas、以前JPanel)を追加する前にJFrameを実現です。あなたが重いと軽い成分を混合することをお勧めしていないので、

がちなみにこの

public BDisplay() {  
    ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    gd = ge.getDefaultScreenDevice(); 

    frame = new Frame(); 
    frame.setResizable(false); 
    frame.add(this); 
    //frame.setLayout(null); // Why are you using a null layout? 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 

EDIT

を試してみて、私の代わりにCanvasJPanelを使用してお勧めします。詳細については、Mixing heavy and light componentsを参照してください。

+0

ありがとう、うまく動作します! –

+0

@Tom S.、あなたは大歓迎です!:) – mre

+0

良いsuggstion +1 – mKorbel

1

と??? javax.swing.Timer

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

public class AnimationJPanel extends JPanel { 

    private static final long serialVersionUID = 1L; 
    private int cx = 0; 
    private int cy = 150; 
    private int cw = 20; 
    private int ch = 20; 
    private int xinc = 1; 
    private int yinc = 1; 

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

      @Override 
      public void run() { 
       AnimationJPanel panel = new AnimationJPanel(); 
       panel.setPreferredSize(new Dimension(400, 300)); 
       panel.animate(); 
       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       frame.getContentPane().add(panel); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public AnimationJPanel() { 
     setLayout(new BorderLayout()); 
     JLabel label = new JLabel("This is an AnimationJPanel"); 
     label.setForeground(Color.RED); 
     label.setHorizontalAlignment(SwingConstants.CENTER); 
     add(label); 
     setBackground(Color.BLACK); 
     setForeground(Color.RED); 
     setOpaque(true); 
    } 

    public void animate() { 
     new Timer(15, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Rectangle oldCircle = new Rectangle(cx - 1, cy - 1, cw + 2, ch + 2); 
       cx += xinc; 
       cy += yinc; 
       if (cx >= getWidth() - cw || cx <= 0) { 
        xinc *= -1; 
       } 
       if (cy >= getHeight() - ch || cy <= 0) { 
        yinc *= -1; 
       } 
       repaint(oldCircle); 
       repaint(cx - 1, cy - 1, cw + 2, ch + 2); 
      } 
     }).start(); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawOval(cx, cy, cw, ch); 
    } 
} 

または

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.awt.Point; 
import java.awt.Polygon; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.Random; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

public class AnimationBackground { 

    public AnimationBackground() { 
     Random random = new Random(); 
     JFrame frame = new JFrame("Animation Background"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 
     final MyJPanel panel = new MyJPanel(); 
     panel.setBackground(Color.BLACK); 
     for (int i = 0; i < 50; i++) { 
      Star star = new Star(new Point(random.nextInt(490), random.nextInt(490))); 
      star.setColor(new Color(100 + random.nextInt(155), 100 + random.nextInt(155), 100 + random.nextInt(155))); 
      star.setxIncr(-3 + random.nextInt(7)); 
      star.setyIncr(-3 + random.nextInt(7)); 
      panel.add(star); 
     } 
     panel.setLayout(new GridLayout(10, 1)); 
     JLabel label = new JLabel("This is a Starry background.", JLabel.CENTER); 
     label.setForeground(Color.WHITE); 
     panel.add(label); 
     JPanel stopPanel = new JPanel(); 
     stopPanel.setOpaque(false); 
     stopPanel.add(new JButton(new AbstractAction("Stop this madness!!") { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       panel.stopAnimation(); 
      } 
     })); 
     panel.add(stopPanel); 
     JPanel startPanel = new JPanel(); 
     startPanel.setOpaque(false); 
     startPanel.add(new JButton(new AbstractAction("Start moving...") { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       panel.startAnimation(); 
      } 
     })); 
     panel.add(startPanel); 
     frame.add(panel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       AnimationBackground animationBackground = new AnimationBackground(); 
      } 
     }); 
    } 

    class Star extends Polygon { 

     private static final long serialVersionUID = 1L; 
     private Point location = null; 
     private Color color = Color.YELLOW; 
     private int xIncr, yIncr; 
     static final int WIDTH = 500, HEIGHT = 500; 

     Star(Point location) { 
      int x = location.x; 
      int y = location.y; 
      this.location = location; 
      this.addPoint(x, y + 8); 
      this.addPoint(x + 8, y + 8); 
      this.addPoint(x + 11, y); 
      this.addPoint(x + 14, y + 8); 
      this.addPoint(x + 22, y + 8); 
      this.addPoint(x + 17, y + 12); 
      this.addPoint(x + 21, y + 20); 
      this.addPoint(x + 11, y + 14); 
      this.addPoint(x + 3, y + 20); 
      this.addPoint(x + 6, y + 12); 
     } 

     public void setColor(Color color) { 
      this.color = color; 
     } 

     public void move() { 
      if (location.x < 0 || location.x > WIDTH) { 
       xIncr = -xIncr; 
      } 
      if (location.y < 0 || location.y > WIDTH) { 
       yIncr = -yIncr; 
      } 
      translate(xIncr, yIncr); 
      location.setLocation(location.x + xIncr, location.y + yIncr); 
     } 

     public void setxIncr(int xIncr) { 
      this.xIncr = xIncr; 
     } 

     public void setyIncr(int yIncr) { 
      this.yIncr = yIncr; 
     } 

     public Color getColor() { 
      return color; 
     } 
    } 

    class MyJPanel extends JPanel { 

     private static final long serialVersionUID = 1L; 
     private ArrayList<Star> stars = new ArrayList<Star>(); 
     private Timer timer = new Timer(20, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       for (Star star : stars) { 
        star.move(); 
       } 
       repaint(); 
      } 
     }); 

     public void stopAnimation() { 
      if (timer.isRunning()) { 
       timer.stop(); 
      } 
     } 

     public void startAnimation() { 
      if (!timer.isRunning()) { 
       timer.start(); 
      } 
     } 

     @Override 
     public void addNotify() { 
      super.addNotify(); 
      timer.start(); 
     } 

     @Override 
     public void removeNotify() { 
      super.removeNotify(); 
      timer.stop(); 
     } 

     MyJPanel() { 
      this.setPreferredSize(new Dimension(512, 512)); 
     } 

     public void add(Star star) { 
      stars.add(star); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      for (Star star : stars) { 
       g.setColor(star.getColor()); 
       g.fillPolygon(star); 
      } 
     } 
    } 
} 
関連する問題