【问题标题】:How do I get my key listener to create a rectangle?如何让我的关键侦听器创建一个矩形?
【发布时间】:2016-09-19 03:29:23
【问题描述】:

这是我的代码。我希望按键监听器在我按下按键时创建一个矩形。我在键监听器中实现填充矩形方法时遇到问题。

我尝试过分离键监听器,但是,我不知道如何将它们相互连接以使用 JPanel 方法。

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

public class Keyboard
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Keyboard");
        frame.setLayout(new BorderLayout());
        MyPanel displayPanel = new MyPanel();
        frame.add(displayPanel, BorderLayout.CENTER);

        frame.addKeyListener(displayPanel);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width, java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().height);
        frame.setVisible(true);
    }
}

MyPanel 类

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

import javax.swing.JPanel;

public class MyPanel extends JPanel implements KeyListener {
    private boolean one;
    private boolean two;
    private boolean three;
    private boolean four;
    private boolean five;
    private boolean six;
    private boolean seven;
    private boolean eight;
    private boolean nine;
    private boolean zero;
    private boolean dash;

    public MyPanel() {
        one = false;
        two = false;
        three = false;
        four = false;
        five = false;
        six = false;
        seven = false;
        eight = false;
        nine = false;
        zero = false;
        dash = false;

    }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        setBackground(new Color(51, 25, 0));

        for(int i=0; i<11; i++)
        {
            if(i%2 == 0)
            {
                g.setColor(Color.WHITE);
                g.fillRect(i*(java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width/11), 450, 212, 1000);   
            }
            else
            {
                g.setColor(Color.BLACK);
                g.fillRect(i*(java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width/11), 450, 174, 1000);   
            }
            if(one==true)
            {
                g.setColor(Color.BLUE);
                g.fillRect(50,50,50,50);
                repaint();
            }
        }
    }
    public void keyPressed(KeyEvent e)
    {
        if(e.getKeyCode() ==KeyEvent.VK_1 && !one)
        {
            System.out.println("asdasda");
            one = true; 
        }
        else if(e.getKeyCode() ==KeyEvent.VK_2 && !two)
        {   
            two = true; 
        }
        else if(e.getKeyCode() ==KeyEvent.VK_3 && !three)
        {   
            three = true;   
        }
        else if(e.getKeyCode() ==KeyEvent.VK_4 && !four)
        {
            four = true;
        }
        else if(e.getKeyCode() ==KeyEvent.VK_5 && !five)
        {
            five = true;
        }
        else if(e.getKeyCode() ==KeyEvent.VK_6 && !six)
        {
            six = true;
        }
        else if(e.getKeyCode() ==KeyEvent.VK_7 && !seven)
        {
            seven = true;
        }
        else if(e.getKeyCode() ==KeyEvent.VK_8 && !eight)
        {
            eight = true;
        }
        else if(e.getKeyCode() ==KeyEvent.VK_9 && !nine)
        {
            nine = true;
        }
        else if(e.getKeyCode() ==KeyEvent.VK_0 && !zero)
        {
            zero = true;
        }
        else if(e.getKeyCode() == 189 && !dash)
        {
            dash = true;
        }
    }
    public void keyReleased(KeyEvent e)
    {
        if(e.getKeyCode() ==KeyEvent.VK_1)
        {
            one = false;
        }
        else if(e.getKeyCode() ==KeyEvent.VK_2)
        {
            two = false;
        }
        else if(e.getKeyCode() ==KeyEvent.VK_3)
        {
            three = false;
        }
        else if(e.getKeyCode() ==KeyEvent.VK_4)
        {
            four = false;
        }
        else if(e.getKeyCode() ==KeyEvent.VK_5)
        {
            five = false;
        }
        else if(e.getKeyCode() ==KeyEvent.VK_6)
        {
            six = false;
        }
        else if(e.getKeyCode() ==KeyEvent.VK_7)
        {
            seven = false;
        }
        else if(e.getKeyCode() ==KeyEvent.VK_8)
        {
            eight = false;
        }
        else if(e.getKeyCode() ==KeyEvent.VK_9)
        {
            nine = false;
        }
        else if(e.getKeyCode() ==KeyEvent.VK_0)
        {
            zero = false;
        }
        else if(e.getKeyCode() == 189)
        {
            dash = false;
        }
    }
    public void keyTyped(KeyEvent e)
    {
        System.out.println("Typed: " + e.getKeyChar());
    }
}

【问题讨论】:

标签: java swing keylistener paintcomponent


【解决方案1】:

前段时间我遇到了类似的问题,我通过创建一个像这样的小矩形类来解决它

package notDeafult;

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

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * 
 */
public class rectangle {
//The basic outline of a rectangle making up the grid

    Rectangle rect;
    int width;
    int height;

    public rectangle() {
    }

    public rectangle(int x, int y) {

        this.width = 80; //Setting the size
        this.height = 80;
        this.rect = new Rectangle(x + 80, y + 30, width, height);//Moving the object to the centre 
    }

    public void draw(Graphics g) {
        g.setColor(Color.green);
        //.drawRect only draws the outline
        g.drawRect(rect.x, rect.y, width, height);

    }

}

然后,当您准备好时,只需在新的 Jpanel 下调用一个绘制方法, 像这样:

jPanel3 = new javax.swing.JPanel(){
    public void paintComponent(Graphics g) {
                super.paintComponent(g);
                rectangle rect = new rectangle(width, height);
                rect.draw(g)



 }

然后你可以给paintComponent自己的方法名,比如paintRectangles之类的

当你按下按键时在这里调用它

else if(e.getKeyCode() ==KeyEvent.VK_5){
            paintRectangles();
}

我认为这样的事情应该可以工作。

【讨论】:

    【解决方案2】:

    我在你的课堂上做了一些改变:

    • 不需要将所有布尔变量初始化为 false,这些是它的值
    • 创建了paintRectangle 方法
    • Eclipse代码格式化(我觉得比较清楚)

    public class MyPanel extends JPanel implements KeyListener {
    
        private boolean one, two, three, four, five, six, seven, eight, nine, zero, dash;
    
        public MyPanel() {
        }
    
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            setBackground(new Color(51, 25, 0));
    
            for (int i = 0; i < 11; i++) {
                if (i % 2 == 0) {
                    g.setColor(Color.WHITE);
                    g.fillRect(
                            i * (java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width
                                    / 11),
                            450, 212, 1000);
                } else {
                    g.setColor(Color.BLACK);
                    g.fillRect(
                            i * (java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width
                                    / 11),
                            450, 174, 1000);
                }
    
            }
    
            paintRectangle(g);
        }
    
        private void paintRectangle(Graphics g) {
            if (one) {
                g.setColor(Color.BLUE);
                g.fillRect(50, 50, 50, 50);
            } else if (two) {
                g.setColor(Color.CYAN);
                g.fillRect(50, 50, 50, 50);
            }
        }
    
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_1 && !one) {
                System.out.println("asdasda");
                one = true;
                repaint();
            } else if (e.getKeyCode() == KeyEvent.VK_2 && !two) {
                two = true;
                repaint();
            } else if (e.getKeyCode() == KeyEvent.VK_3 && !three) {
                three = true;
            } else if (e.getKeyCode() == KeyEvent.VK_4 && !four) {
                four = true;
            } else if (e.getKeyCode() == KeyEvent.VK_5 && !five) {
                five = true;
            } else if (e.getKeyCode() == KeyEvent.VK_6 && !six) {
                six = true;
            } else if (e.getKeyCode() == KeyEvent.VK_7 && !seven) {
                seven = true;
            } else if (e.getKeyCode() == KeyEvent.VK_8 && !eight) {
                eight = true;
            } else if (e.getKeyCode() == KeyEvent.VK_9 && !nine) {
                nine = true;
            } else if (e.getKeyCode() == KeyEvent.VK_0 && !zero) {
                zero = true;
            } else if (e.getKeyCode() == 189 && !dash) {
                dash = true;
            }
        }
    
        public void keyReleased(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_1) {
                one = false;
            } else if (e.getKeyCode() == KeyEvent.VK_2) {
                two = false;
            } else if (e.getKeyCode() == KeyEvent.VK_3) {
                three = false;
            } else if (e.getKeyCode() == KeyEvent.VK_4) {
                four = false;
            } else if (e.getKeyCode() == KeyEvent.VK_5) {
                five = false;
            } else if (e.getKeyCode() == KeyEvent.VK_6) {
                six = false;
            } else if (e.getKeyCode() == KeyEvent.VK_7) {
                seven = false;
            } else if (e.getKeyCode() == KeyEvent.VK_8) {
                eight = false;
            } else if (e.getKeyCode() == KeyEvent.VK_9) {
                nine = false;
            } else if (e.getKeyCode() == KeyEvent.VK_0) {
                zero = false;
            } else if (e.getKeyCode() == 189) {
                dash = false;
            }
        }
    
        public void keyTyped(KeyEvent e) {
            System.out.println("Typed: " + e.getKeyChar());
        }
    }
    

    【讨论】:

      【解决方案3】:

      我发现了问题所在。这是您的问题的代码。

      import javax.swing.*;
      import java.awt.*;
      
          public class Keyboard
          {
              public static void main(String[] args)
              {
                  JFrame frame = new JFrame("Keyboard");
                  frame.setLayout(new BorderLayout());
                  MyPanel displayPanel = new MyPanel();
                  frame.add(displayPanel, BorderLayout.CENTER);
      
                  frame.addKeyListener(displayPanel);
      
                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  frame.setSize(java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width, java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().height);
                  frame.setVisible(true);
              }
          }
      

      这是 MyPanel 类

      import java.awt.event.*;
      import javax.swing.*;
      import java.awt.*;
      import java.awt.image.ImageObserver;
      import java.text.AttributedCharacterIterator;
      import javax.swing.JComponent;
      
      import javax.swing.JPanel;
      
      public class MyPanel extends JPanel implements KeyListener {
          private boolean one;
          private boolean two;
          private boolean three;
          private boolean four;
          private boolean five;
          private boolean six;
          private boolean seven;
          private boolean eight;
          private boolean nine;
          private boolean zero;
          private boolean dash;
          Graphics g;
      
          public MyPanel() {
              one = false;
              two = false;
              three = false;
              four = false;
              five = false;
              six = false;
              seven = false;
              eight = false;
              nine = false;
              zero = false;
              dash = false;
      
          }
          @Override
          public void paintComponent(Graphics g)
          {
              super.paintComponent(g);
              setBackground(new Color(51, 25, 0));
      
              for(int i=0; i<11; i++)
              {
                  if(i%2 == 0)
                  {
                      g.setColor(Color.WHITE);
                      g.fillRect(i*(java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width/11), 450, 212, 1000);   
      
                  }
                  else
                  {
                      g.setColor(Color.BLACK);
                      g.fillRect(i*(java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width/11), 450, 174, 1000);   
                  }
                  if(one==true)
                  {
      
                      g.setColor(Color.BLUE);
                      g.drawRect(50, 50, 50, 50);
                      g.fillRect(50,50,50,50);
                      repaint();
      
                  }
      
              }
          }
          @Override
          public void keyPressed(KeyEvent e)
          {
              if(e.getKeyCode() ==KeyEvent.VK_1)
              {
      
                      one = true; 
                      repaint();
                  System.out.println("asdasda");
      
      
              }
              else if(e.getKeyCode() ==KeyEvent.VK_2 && !two)
              {   
                  two = true; 
              }
              else if(e.getKeyCode() ==KeyEvent.VK_3 && !three)
              {   
                  three = true;   
              }
              else if(e.getKeyCode() ==KeyEvent.VK_4 && !four)
              {
                  four = true;
              }
              else if(e.getKeyCode() ==KeyEvent.VK_5 && !five)
              {
                  five = true;
              }
              else if(e.getKeyCode() ==KeyEvent.VK_6 && !six)
              {
                  six = true;
              }
              else if(e.getKeyCode() ==KeyEvent.VK_7 && !seven)
              {
                  seven = true;
              }
              else if(e.getKeyCode() ==KeyEvent.VK_8 && !eight)
              {
                  eight = true;
              }
              else if(e.getKeyCode() ==KeyEvent.VK_9 && !nine)
              {
                  nine = true;
              }
              else if(e.getKeyCode() ==KeyEvent.VK_0 && !zero)
              {
                  zero = true;
              }
              else if(e.getKeyCode() == 189 && !dash)
              {
                  dash = true;
              }
          }
          public void keyReleased(KeyEvent e)
          {
              if(e.getKeyCode() ==KeyEvent.VK_1)
              {
                  one = false;
              }
              else if(e.getKeyCode() ==KeyEvent.VK_2)
              {
                  two = false;
              }
              else if(e.getKeyCode() ==KeyEvent.VK_3)
              {
                  three = false;
              }
              else if(e.getKeyCode() ==KeyEvent.VK_4)
              {
                  four = false;
              }
              else if(e.getKeyCode() ==KeyEvent.VK_5)
              {
                  five = false;
              }
              else if(e.getKeyCode() ==KeyEvent.VK_6)
              {
                  six = false;
              }
              else if(e.getKeyCode() ==KeyEvent.VK_7)
              {
                  seven = false;
              }
              else if(e.getKeyCode() ==KeyEvent.VK_8)
              {
                  eight = false;
              }
              else if(e.getKeyCode() ==KeyEvent.VK_9)
              {
                  nine = false;
              }
              else if(e.getKeyCode() ==KeyEvent.VK_0)
              {
                  zero = false;
              }
              else if(e.getKeyCode() == 189)
              {
                  dash = false;
              }
          }
          public void keyTyped(KeyEvent e)
          {
              System.out.println("Typed: " + e.getKeyChar());
          }
      }
      

      您的代码不工作的原因是您在设置 one = true; 后没有调用 repaint() 方法。现在您的代码正在运行。检查并让我知道是否有任何混淆。

      注意:这仅适用于 Key 1。现在对其他 Key 执行类似操作。

      【讨论】:

        猜你喜欢
        • 2023-03-20
        • 2014-01-20
        • 1970-01-01
        • 2014-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-24
        相关资源
        最近更新 更多