Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

2次元ランダムウォークを作成していますがrepaint()で…

題名の通り、JAVAで2次元ランダムウォークを作成中です。しかし、repaint()がうまくいかず、描画がうまくいかないようです。私なりに色々なプログラムを参照し試行錯誤しましたが、いまいち理由がわかりません。ご教授いただけたら幸いです。

//awt
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout    ;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.*;
import java.awt.Container.*;
//util
import java.util.*;
import java.util.Timer;
//javax.swing
import javax.swing.*;

public class rw extends JFrame{
    JTextField antmax;
    JButton button;
    JLabel label;
     private final List<Point> points_ = new ArrayList<Point>();//??

    int start=0;
    static String labelPrefix="#of ants";
    Random r= new Random();
    class ButtonAction implements ActionListener{
        public void actionPerformed(ActionEvent e){
            start=1;
            System.out.println(start);
            init();
        }
    }

    public rw(){
        Box pane = Box.createVerticalBox();

        Timer timer = new Timer();//Timer
        timer.schedule(new TimerTask() {
            public void run() {
                
                Repaint();
                
            };
        }, 0, 1000L);
    }
    
    public void Repaint(){
        
        repaint();
    }
    
    Component createComponents(){
    label=new JLabel(labelPrefix);
    antmax=new JTextField(5);
    button=new JButton("start");
    button.addActionListener(new ButtonAction());
    JPanel pane1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
    pane1.setLayout(new BorderLayout());
    pane1.add(label);
    pane1.add(antmax);
    pane1.add(button);
    
    JPanel pane2 = new JPanel(new FlowLayout    (FlowLayout.LEFT));
    pane2.setLayout(new BorderLayout());
    pane2.add(createDraw(),BorderLayout.SOUTH);
    JPanel pane = new JPanel(new FlowLayout    (FlowLayout.LEFT));
    
    pane.add(pane1);
    pane.add(pane2);
    return pane;
    }
    
    
    Component createDraw(){
        draw.setPreferredSize(new Dimension(300,300));
        return draw;
    }
    
    JPanel draw=new JPanel(){
        public void paintComponent(Graphics g){
            //super.paintComponent(g);
            if(start==1){
                System.out.println("if");
                for(Point p:points_){
                    if(r.nextInt(4)==0){
                        p.x +=2;
                        System.out.println(p.x+","+p.y);
                    }
                    else if(r.nextInt(4)==1){
                        p.x -=2;
                        System.out.println(p.x+","+p.y);
                    }
                    else if(r.nextInt(4)==2){
                        p.y +=2;
                        System.out.println(p.x+","+p.y);
                    }
                    else if(r.nextInt(4)==3){
                        p.y -=2;
                        System.out.println(p.x+","+p.y);
                    }
                    g.setColor(Color.black);
                    g.fillRect(p.x,p.y,2,2);
                }
        }
        }
    };

    private void init() {
        int count = 200;
        points_.clear();
        points_.add(new Point(300 / 2, 300 / 2));
        for (int index = 1; index < count; index++) {
            points_.add(new Point(r.nextInt(300), r.nextInt(300)));
        
        }
    }


    public static void main(String[] args){
        JFrame frame = new JFrame("RandomWalk");
        /*frame.addWindowListener(
                new WindowAdapter(){
                    public void windowClosing(WindowEvent e){
                        System.exit(0);}
                });*/
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        rw app1 = new rw();
    //    rw app2 = new rw();
        Component content1 =app1.createComponents();
        //Component content2 =app2.createDraw();
        frame.getContentPane().add(content1);
        //frame.getContentPane().add(content2);
        frame.pack();
        frame.setVisible(true);    
    }
}

よろしくお願いいたします。

1

回答

3204

閲覧

1件の回答

評価

0

JFrameはアプリケーションのメインウィンドウなので、そのrepaint()を呼ぶことはまずない。

JFrameのcontentPaneにadd()したコンポーネント…このプログラムの場合それはdrawでしょう…のrepaint()を呼んでください。Swingのアプリケーションでは、java.util.Timerよりも、javax.swing.Timerを使うほうが簡単です。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。