1

菜单栏不会绘制,keylistener 也不会工作。我应该将菜单栏添加到面板还是内容窗格?我究竟做错了什么?该怎么办?帮助?谢谢!

请先复制并运行代码。

课堂绘图演示

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

public class DrawingDemo extends JFrame implements ActionListener, KeyListener{
DrawingPanel demo = new DrawingPanel();
public DrawingDemo()
{

getContentPane().add(demo);
setVisible(true);
setSize(1024,720);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);

JPanel p = new JPanel();
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);

while(true){
 demo.repaint();
}
}
public void actionPerformed(java.awt.event.ActionEvent e)
{
}
public void KeyEvent(java.awt.event.ActionEvent e)
{
}
public void keyReleased(java.awt.event.KeyEvent e)
{
}
public void keyPressed(java.awt.event.KeyEvent e)
 {
 switch (e.getKeyCode()){
    case KeyEvent.VK_A : 
    {
    demo.pos_camx -= 0.5;
    }
    break;
    case KeyEvent.VK_D :
    {
    demo.pos_camx += 0.5;
    }
    break;
    case KeyEvent.VK_W :
    {
    demo.pos_camy += 0.5;
    }
    break;
    case KeyEvent.VK_S :
    {
    demo.pos_camy -= 0.5;
    }
    break;
    } 
}
public void keyTyped(java.awt.event.KeyEvent e)
{
}
public static void main(String[] args)
{
    new DrawingDemo();
}
}

类绘图板

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

public class DrawingPanel extends JPanel {

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;
  int pxscr,pyscr,nxscr,nyscr,e;



 public void paint(Graphics g)
 {
            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_camx = 0;
 pos_camy = 0;
 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();
 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 = 20 + (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 = 20 + (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);
         long currentTime = System.currentTimeMillis();
  if (currentTime > nextSecond) {
    nextSecond += 1000;
    framesInLastSecond = framesInCurrentSecond;
    framesInCurrentSecond = 0;
  }
 framesInCurrentSecond++;
 g.drawString(framesInLastSecond + " fps", 20, 20);
}

}
4

2 回答 2

3

Swing 是一个事件驱动的环境,以任何方式阻塞事件调度线程都会阻止它开始处理任何事件(例如鼠标或键盘事件)。

KeyListener是一个低级别的 API,由于多种原因通常不鼓励使用,焦点问题是最突出的。为了使组件能够响应 aKeyListener它必须是可聚焦的并且具有焦点。您遇到的问题是,这些条件实际上都没有得到满足(您实际上也没有用任何东西注册关键侦听器)。

虽然JFrame是可聚焦的,但它包含JRootPane一个内容窗格,其中包含(除其他外)一个内容窗格,其中包含您的DrawingPanel. 这些中的任何一个都可能随时从框架中窃取焦点,从而使您KeyListener毫无用处。

首选方法是使用键绑定 API

通常,不鼓励您覆盖paint. Paint 是一种非常复杂的方法,只有在您绝对确定它是正确的做法时才应该覆盖它。执行自定义绘画的首选方法是覆盖该paintComponent方法,如此所述。最重要的原因是这种方法是双缓冲的,让你画得更流畅,而且,你一般不会干扰组件上可能存在的其他组件。

此外,在您的绘画方法中,您正在设置相机位置0,基本上取消您与非功能键监听器的所有良好工作;)

public class DrawingDemo extends JFrame { //implements ActionListener, KeyListener {

    DrawingPanel demo = new DrawingPanel();

    public DrawingDemo() {

        getContentPane().add(demo);
        setVisible(true);
        setSize(1024, 720);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        JPanel p = new JPanel();
        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) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new DrawingDemo();
            }
        });
    }

    public class DrawingPanel extends JPanel {

        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;
        int pxscr, pyscr, nxscr, nyscr, e;

        public DrawingPanel() {
            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), "Move.A");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0), "Move.D");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "Move.W");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0), "Move.S");

            ActionMap am = getActionMap();
            am.put("Move.A", new MoveXAction(this, 0.5f));
            am.put("Move.D", new MoveXAction(this, -0.5f));
            am.put("Move.W", new MoveYAction(this, 0.5f));
            am.put("Move.S", new MoveYAction(this, -0.5f));
        }

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

            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_camx = 0;
//            pos_camy = 0;
//            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();
            Graphics2D g1 = (Graphics2D) g;
            g1.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g.setColor(Color.black);
            xpoint = (double) (LP[0][0]) / 2;
            ypoint = 20 + (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 = 20 + (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);
            long currentTime = System.currentTimeMillis();
            if (currentTime > nextSecond) {
                nextSecond += 1000;
                framesInLastSecond = framesInCurrentSecond;
                framesInCurrentSecond = 0;
            }
            framesInCurrentSecond++;
            g.drawString(framesInLastSecond + " fps", 20, 20);
        }
    }

    public class MoveXAction extends AbstractAction {

        private float direction;
        private final DrawingPanel pane;

        private MoveXAction(DrawingPanel pane, float amount) {

            this.direction = amount;
            this.pane = pane;

        }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("...x by " + direction);
            pane.pos_camx += direction;
            pane.repaint();
        }

    }

    public class MoveYAction extends AbstractAction {

        private float direction;
        private final DrawingPanel pane;

        private MoveYAction(DrawingPanel pane, float amount) {

            this.direction = amount;
            this.pane = pane;

        }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("...y by " + direction);
            pane.pos_camy += direction;
            pane.repaint();
        }

    }

}

我玩得很快,我不得不说,很好;)

于 2012-12-12T04:19:50.727 回答
0

如果有什么改变,你只需要重新绘制,即使那样,也可能不是每秒一百万次(或者你的 cpu 可以处理的任何东西)。所以我建议将其更改为while(true)等待一段时间的循环,或在 keylistener 中重新绘制(取决于您希望应用程序执行的操作)

并且您实现了keylistener接口,但是您没有将其添加到注册的侦听器中,因此您需要一个this.addKeyListener(this);

JMenuBar没有显示,因为您在添加菜单栏之前使框架可见。通常,您希望在初始化其组件后使窗口可见。所以setVisible(true);在你添加菜单栏之后放

于 2012-12-12T03:41:57.243 回答