-1

我正在尝试在 JFrame 中的 JPanel 中运行 Runnable 类。该程序编译,但它没有按预期工作。屏幕上应该有一个立方体旋转,顶部有一些菜单。我究竟做错了什么?如果我将 T3D 类转换为小程序,那么程序运行得很好,它会重新绘制,它会做所有事情。当我尝试放入 JFrame(作为 Jpanel 或小程序)时,它不会重新绘制,它不会执行 init() 中的内容。谢谢您的帮助!

绘图演示课

import javax.swing.*;
import java.awt.geom.*;
import java.awt.*;
import java.awt.Graphics;
import java.applet.Applet;

public class DrawingDemo extends JFrame{
public DrawingDemo()
{
T3D demo = new T3D();
getContentPane().add(demo);
setVisible(true);
setSize(1024,720);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);

T3D p = new T3D();
JMenuBar mb = new JMenuBar();
JMenu file = new JMenu("File");
JMenu edit = new JMenu("Edit");
JMenu settings = new JMenu("Settings");
JMenu help = new JMenu("Help");
JMenuItem exit = new JMenuItem(">Exit");
JMenuItem imp = new JMenuItem(">Import");
JMenuItem exp = new JMenuItem(">Export");
JMenuItem sav = new JMenuItem(">Save");
JMenuItem ope = new JMenuItem(">Open");
file.add(ope);  
file.add(sav);
file.add(imp);
file.add(exp);
file.add(exit);
mb.add(file);
mb.add(edit);
mb.add(settings);
mb.add(help);
setJMenuBar(mb);
}

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

}

3D类

import java.awt.*;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;
import javax.swing.*;

 public class T3D extends JPanel implements Runnable {
 long nextSecond = System.currentTimeMillis() + 1000;
 int framesInLastSecond = 0;
 int framesInCurrentSecond = 0;
 int[][] LP= new int[19][3];
 double pos_camx,pos_camy,pos_camz,rot_camx,rot_camy,xpoint,ypoint,zpoint;
 double rot_radx,rot_rady,nclip,xscr,yscr,kx,ky,e;
 int pxscr,pyscr,nxscr,nyscr;

 public void start1() {
  Thread th = new Thread(this);
  th.start();

 }

 public void keyPressed(KeyEvent e) {
    switch (e.getKeyCode()){
    case KeyEvent.VK_A : 
    {
    pos_camx -= 0.01;
    }
    case KeyEvent.VK_D :
    {
    pos_camx += 0.01;
    }
    case KeyEvent.VK_W :
    {
    pos_camy += 0.01;
    }
    case KeyEvent.VK_S :
    {
    pos_camy -= 0.01;
    }
    } 
 }


 @Override
 public void run(){
  // This will reduce the load the applet has on the runtime
  // system..
  Thread.currentThread().setPriority(1);
  while (true) {
      e+=0.01;
      pos_camx = Math.cos(e);
      pos_camy = Math.sin(e);
      repaint();
     try {
      Thread.sleep(20);
     } catch (InterruptedException ie) {
     }
  }

}

public void init() {

        LP[0][0] = -1;
        LP[0][1] = -1;
        LP[0][2] = -1;

        LP[1][0] = 1;
        LP[1][1] = -1;
        LP[1][2] = -1;

        LP[2][0] = 1;
        LP[2][1] = 1;
        LP[2][2] = -1;

        LP[3][0] = -1;
        LP[3][1] = 1;
        LP[3][2] = -1;

        LP[4][0] = -1;
        LP[4][1] = -1;
        LP[4][2] = -1;

        LP[5][0] = 1;
        LP[5][1] = 1;
        LP[5][2] = -1;

        LP[6][0] = 1;
        LP[6][1] = 1;
        LP[6][2] = 1;

        LP[7][0] = -1;
        LP[7][1] = 1;
        LP[7][2] = 1;

        LP[8][0] = -1;
        LP[8][1] = -1;
        LP[8][2] = 1;

        LP[9][0] = 1;
        LP[9][1] = -1;
        LP[9][2] = 1;

        LP[10][0] = 1;
        LP[10][1] = 1;
        LP[10][2] = 1;

        LP[11][0] = -1;
        LP[11][1] = -1;
        LP[11][2] = 1;

        LP[12][0] = -1;
        LP[12][1] = -1;
        LP[12][2] = -1;

        LP[13][0] = 1;
        LP[13][1] = -1;
        LP[13][2] = 1;

        LP[14][0] = 1;
        LP[14][1] = -1;
        LP[14][2] = -1;

        LP[15][0] = 1;
        LP[15][1] = 1;
        LP[15][2] = 1;

        LP[16][0] = -1;
        LP[16][1] = 1;
        LP[16][2] = -1;

        LP[17][0] = -1;
        LP[17][1] = 1;
        LP[17][2] = 1;

        LP[18][0] = -1;
        LP[18][1] = -1;
        LP[18][2] = -1; 


 pos_camz = 0;

 rot_camx = 0;
 rot_camy = 0;
 rot_radx = 3.1415*rot_camx/180;
 rot_rady = 3.1415*rot_camy/180;

 nclip = 0.275;
 kx = 8.52/getWidth();
 ky = 5.46/getHeight();
}

 // Drawing instructions…
 public void paint(Graphics g) {
  super.paint(g);
  Graphics2D g1 = (Graphics2D)g;
  g1.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  g.setColor(Color.black);
     xpoint = (double)(LP[0][0])/2;
     ypoint = 10 + (double)(LP[0][1])/2;
     zpoint = (double)(LP[0][2])/2;

     pxscr = (int)(
     ((xpoint - pos_camx)*Math.cos(rot_radx) + (ypoint + pos_camy)*Math.sin(rot_radx))*nclip
     /((ypoint - pos_camy)*Math.cos(rot_radx) + (pos_camx- xpoint)*Math.sin(rot_radx) + 0.0000000012)*100/kx
                  + getWidth()/2);

     pyscr = (int)(
                  getHeight()/2-
     (((ypoint + pos_camy)*Math.sin(rot_rady) + (zpoint - pos_camz)*Math.cos(rot_rady))*nclip
     /((ypoint - pos_camy)*Math.cos(rot_radx) + (pos_camx + xpoint)*Math.sin(rot_radx) + 0.0000000012)*100/ky)
                  );
     for (int i=1; i<19;i++){
            xpoint = (double)(LP[i][0])/2;
            ypoint = 10 + (double)(LP[i][1])/2;
            zpoint = (double)(LP[i][2])/2;

            nxscr = (int)(
         ((xpoint - pos_camx)*Math.cos(rot_radx) + (ypoint + pos_camy)*Math.sin(rot_radx))*nclip
         /((ypoint - pos_camy)*Math.cos(rot_radx)+(pos_camx + xpoint)*Math.sin(rot_radx)+0.0000000012)*100/kx
                         +getWidth()/2);

            nyscr = (int)(
                         getHeight()/2-
         (((ypoint + pos_camy)*Math.sin(rot_rady)+(zpoint - pos_camz)*Math.cos(rot_rady))*nclip
         /((ypoint - pos_camy)*Math.cos(rot_radx)+(pos_camx + xpoint)*Math.sin(rot_radx)+0.0000000012)*100/ky)
                         );
            g1.drawLine(pxscr,pyscr,nxscr,nyscr);
         pxscr = nxscr;
         pyscr = nyscr;
        }
         g.drawString("(" + pxscr + "," + pyscr + ")",20,40);
         g.drawString("" + pos_camx + ")",20,60);
         g.drawString("" + pos_camy,20,80);
         g.drawString("" + rot_camx,20,100);
  long currentTime = System.currentTimeMillis();
if (currentTime > nextSecond) {
    nextSecond += 1000;
    framesInLastSecond = framesInCurrentSecond;
    framesInCurrentSecond = 0;
}
    framesInCurrentSecond++;

g.drawString(framesInLastSecond + " fps", 20, 20);
}

// The standard Applet “GO” function…
public void start() {
   Thread th = new Thread(this);
  th.start();
}
}
4

1 回答 1

2

现在我想我看到了你的问题。您采用了一个扩展 JApplet 的类,并尝试将其更改为 JPanel,而保留 init() 方法并保持原样。Swing 不是这样工作的。您将需要重新编写 JApplet 类型的类,摆脱诸如 init() 和 start() 之类的 applet 特定方法,而是可能在类的构造函数中初始化该代码。您需要了解如何在 Swing 中制作图形和动画——例如使用 JPanel 的 paintComponent 方法和 Swing Timer,这种方式可能会成功。

于 2012-12-05T18:06:45.867 回答