有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java小程序不会在JPanel中运行

我试图在JFrame中的JPanel中运行一个可运行类。程序可以编译,但不能按预期工作。屏幕上应该有一个旋转的立方体,上面有一些菜单。我做错了什么?如果我把T3D类转换成一个小程序,那么这个程序运行得很好,它可以重新绘制,它可以做任何事情。当我尝试放入JFrame(作为Jpanel或applet)时,它不会重新绘制,也不会执行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();
}
}

共 (1) 个答案

  1. # 1 楼答案

    现在我想我明白你的问题了。您已经使用了一个扩展JApplet的类,并试图将其更改为JPanel,而保持init()方法和所有内容不变。Swing不是那样工作的。您需要重新编写JApplet类型类,去掉特定于applet的方法,如init()和start(),而可能在类的构造函数中初始化该代码。例如,您需要了解如何使用JPanel的paintComponent方法和Swing计时器在Swing中创建图形和动画,这种方法很可能会成功