0

コードは次のとおりです。

クラスaa

package com.MahBonnets.Game;

import javax.swing.*;

public class aa {

public static ab f = new ab();
public static int width = 600;
public static int height = 400;
public static void main(String args[]) {
        f.setSize(width, height);
        f.setResizable(false);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setTitle("MAH BONNETS IS GONE");
        f.setLocationRelativeTo(null);
        System.out.println("Running!!");
}
}

ab

package com.MahBonnets.Game;

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

public class ab extends JFrame {

public ac panel;

public ab() {
    panel = new ac(this);
    setLayout(new GridLayout (1, 1, 0, 0));
    add(panel);
}
}

そしてAC

package com.MahBonnets.Game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;

import javax.swing.*;

public class ac extends JPanel implements Runnable {
public Rectangle floor;

public int floorheight = 80;
public int fps = 1000;

public boolean objectDefine = false;

public Thread game;
public ac(ab f) {
    setBackground(Color.black);

    defineObjects();

    game = new Thread(this);
    game.start(); }

void defineObjects() {
        floor = new Rectangle(-10, aa.height-floorheight, aa.width+10, floorheight);
        objectDefine = true;
        repaint();
}

public void paint(Graphics g) {
    super.paint(g);

    if(objectDefine) {
        g.setColor(Color.RED);
        g.fillRect(floor.x, floor.y, floor.width, floor.height);
}
}


public void fpsSetter() {
try{
    Thread.sleep(fps/1000); 
}catch(Exception e) {
    e.printStackTrace();

        }

  }
  @Override
  public void run(){
      // TODO Auto-generated method stub
  }
}

起きているはずなのに起きていないのは、JFrame の下部に赤い四角形が表示されるはずだということです。私はプログラミングにまったく慣れていませんが、長方形に関連するコードのセクションを調べたところ、すべてが順番に見えました...少なくとも...私が知る限り。

何が間違っているのか考えられる場合は、私を助けてください。ありがとう。

これが私がフォローしているYouTubeチュートリアルですhttp://www.youtube.com/watch?v=0lfhcKAIr-8

4

3 に答える 3

3
  1. マジックナンバーに頼らないで...
  2. 現実と一致しない可能性のあるパラメーターに依存しないでpublic static int width = 600ください (子コンポーネントと同じサイズにはなりません)。getWidthとを使用しgetHeightて、コンポーネントの実際のサイズを取得します...
  3. あなたを取り除き、defineObjectsあなたのコンポーネントの実際に知られている状態に頼る
  4. paintメソッドを取り除き、paintComponent代わりに使用する
  5. staticいつもあなたの友達ではない
  6. ポスターに参照がない限り、YouTube を参照として使用しないでください ;)
  7. カスタムペインティングの実行をお読みください
  8. AWT と Swing でのペイントをお読みください
  9. Swing での同時実行をお読みください

paintメソッドを次のようなものに置き換えてください...

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.

    int x = -10;
    int y = getHeight() - floorheight;
    int width = getWidth() + 10;
    int height = floorheight;
    floor = new Rectangle(x, y, width, height);
    g.setColor(Color.RED);
    g.fillRect(floor.x, floor.y, floor.width, floor.height);
}

そしてThread.sleep(1000 / 1000)、違いがないほど睡眠なしに近いです;) - 25fpsはおおよそ40ミリ秒です;)

于 2013-05-06T05:48:33.133 に答える
2

「aa」クラスでは、ab の静的インスタンス (行: public static ab f = new ab();) の代わりに、メイン メソッドに対してローカルな変数を使用してみてください。お気に入り:

//public static ab f = new ab();
public static int width = 600;
public static int height = 400;
public static void main(String args[]) {
        ab f = new ab(); // local var
        f.setSize(width, height);
        f.setResizable(false);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setTitle("MAH BONNETS IS GONE");
        f.setLocationRelativeTo(null);
        System.out.println("Running!!");
}

または、「ac」クラスの defineObjects() メソッドから aa.width および aa.height への静的参照を削除することもできます。

floor = new Rectangle(-10, aa.height-floorheight, aa.width+10, floorheight); //take out the static references !!!

理由を理解するために簡単なテストを行います。変更を行う前に、aa.width と aa.height の値を出力すると、それらがゼロであることがわかります。

于 2013-05-06T05:32:27.827 に答える