0

JFrameを作成し、フレームにボタンを貼り付け、「launchbutton」をクリックして、そのボタンが放物線の弧を描いてフレームを横切るのを見るために使用している次のプログラムがあります。しかし、私のボタンはまったく表示されません。ボタンの動きを別のスレッドに移動し、actionlistener でそのスレッドを呼び出していますが、ボタン (移動する) が表示され、その端点に表示されるだけなので、機能していないようです。

package kinetic.energy.viewer;

import javax.swing.*;
import java.applet.*;

import java.awt.event.*;
import java.math.*;

public class KineticEnergyViewer  {


public static void main(String[] args) {
    final JFrame viewframe = new JFrame("Welcome to Gravitational Launcher");
    viewframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    viewframe.setSize(700,500);
    viewframe.setVisible(true);
    viewframe.setLayout(null);

    JButton launchbutton = new JButton("Launch");
    launchbutton.setSize(100,100);
    launchbutton.setLocation(600, 400);
    viewframe.add(launchbutton);

    final JButton rock = new JButton("YES!");
    rock.setSize(50,50);
    final GravitationalThread t = new GravitationalThread(9.8, (Math.PI)/4, 100, 500, 0, viewframe, rock);
    final Dumbthread g = new Dumbthread();
    launchbutton.addActionListener(new ActionListener()
                {
                //GravitationalThread t = new GravitationalThread(9.8, (Math.PI)/4, 100, 500, 0, viewframe, rock);
                public void actionPerformed(ActionEvent e){
                    g.run();
                    t.run();
                }
            });

}
}

--

package kinetic.energy.viewer;

import javax.swing.*;
import java.applet.*;

import java.awt.event.*;
import java.math.*;

public class KineticEnergyViewer  {


public static void main(String[] args) 
{
    final JFrame viewframe = new JFrame("Welcome to Gravitational Launcher");
    viewframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    viewframe.setSize(700,500);
    viewframe.setVisible(true);
    viewframe.setLayout(null);

    JButton launchbutton = new JButton("Launch");
    launchbutton.setSize(100,100);
    launchbutton.setLocation(600, 400);
    viewframe.add(launchbutton);

    final JButton rock = new JButton("YES!");
    rock.setSize(50,50);
    final GravitationalThread t = new GravitationalThread(9.8, (Math.PI)/4, 100, 500, 0, viewframe, rock);
    final Dumbthread g = new Dumbthread();
    launchbutton.addActionListener(new ActionListener()
                {
                //GravitationalThread t = new GravitationalThread(9.8, (Math.PI)/4, 100, 500, 0, viewframe, rock);
                public void actionPerformed(ActionEvent e){
                    g.run();
                    t.run();
                }
            });

}
}

実行可能なクラス:

package kinetic.energy.viewer;

import java.lang.Thread.*;
import javax.swing.*;
import java.math.*;

public class GravitationalThread implements Runnable {
double grav, ang, vel,y,x;
JFrame targframe;
JButton targbutton;


public void run()
{
    double step = 0.01;
    double k = 0;
    double yoriginal = y;
    double xoriginal = x;
    while(y < 600 && x < 800)
    {
        System.out.println((int)x + " " + (int)y);

        y = yoriginal - vel*(Math.sin(ang))*k + (grav/2)*k*k;
        x = xoriginal + vel*(Math.cos(ang))*k;

        targframe.remove(targbutton);
        targbutton.setLocation((int)x, (int)y);
        targframe.add(targbutton);
        targframe.repaint();
        k = k + step;
        int j = 0;
        int i = 0;

        while(j < 10000)  
        {
            while(i < 10000)
            {
                i++;
            }

            j++;
        }
    }
}

GravitationalThread(double gravity, double angle, double velocity, double ypos, double xpos, JFrame whereat, JButton who)
{
    targbutton = who; //initialize variables
    targframe = whereat;
    grav = gravity;
    ang = angle;
    vel = velocity;
    y = ypos;
    x = xpos;
    targbutton.setLocation((int)x, (int)y);
    targframe.add(targbutton);
    targframe.validate();
}
}

そして、私が使用しようとしている空のスレッド:

package kinetic.energy.viewer;

import java.lang.Thread.*;
import javax.swing.*;
import java.math.*;
public class Dumbthread implements Runnable {
Dumbthread()
{

}

public void run()
{
    int i = 0;
    while(i < 1000)
    {
        i = i + 1;
    }
}
}
4

1 に答える 1

0
g.run();
t.run();

GravitationalThread tおよびDumbthread gが 2 つの異なる実行スレッドで実行されることはありません。それらは、呼び出された場所と同じ実行スレッドで実行されます。それらを 2 つの別個の実行スレッドで開始するには、以下のように 2 つの別個のスレッドを開始する必要があります。

launchbutton.addActionListener(new ActionListener()
                {
                //GravitationalThread t = new GravitationalThread(9.8, (Math.PI)/4, 100, 500, 0, viewframe, rock);
                public void actionPerformed(ActionEvent e){
                    new Thread(g).start();
                    new Thread(t).start();
                }
            });
于 2013-10-24T13:23:38.933 に答える