【问题标题】:KeyListener is not interacting correctly with rest of programKeyListener 未与程序的其余部分正确交互
【发布时间】:2020-11-04 08:11:10
【问题描述】:

每当我按下空格键或任何其他键时,我尝试配置它都不会更改“pixelsizemodifier”变量。我什至无法将其打印到控制台。我不知道我哪里错了。除此之外运行完美。

提前为我糟糕的代码道歉。有段时间没写,靠记忆试验。

我想要它做的是接受一个关键事件来更改变量,例如像素大小或像素密度或颜色等以后的事情。

package square;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class main extends JPanel implements KeyListener {
    
    Random rand;
    int randomInt, boxQuantity, lineCount, ovalCount;
    static JFrame frame;
    static JPanel p;
    boolean painting = false;
    int re,gr,bl;
    Color color;
    int pixelsize , pixelsizemodifier = 10, pixeldistance;

    public static void main(String[] args) {
        frame = new JFrame("Welcome!");
        frame.getContentPane().add(new main());
        frame.setSize(800,600);
        
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setResizable(true);
        
        frame.setVisible(true);
        
        
        p = new JPanel();
        p.setVisible(true);
        
        frame.add(p);
        new main().go();
        
    } 
    
    public void go() {
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
    }
    
    public void paint(Graphics g) {
        super.paint(g);
        rand = new Random();
        
        boxQuantity = 0;
        ovalCount = 0;
        for (int x = 0; x < frame.getWidth()/10; x++) {
            for (int y = 0; y < frame.getHeight()/10; y++) {
                
                re = rand.nextInt(255);
                gr = rand.nextInt(255);
                bl = rand.nextInt(255);
                color = new Color(re , gr , bl);
                g.setColor(color);
                
                randomInt = rand.nextInt(4);
                pixelsize = rand.nextInt(pixelsizemodifier);
                pixeldistance = rand.nextInt(11);
                
                switch (randomInt) {
                    case 0:
                        g.fillRect(x*10, y*pixeldistance, pixelsize, pixelsize);
                        break;
                    case 1:
                        g.fillRect(x*10, y*pixeldistance, pixelsize, pixelsize);
                        break;
                    case 2:
                        g.fillRect(x*10, y*pixeldistance, pixelsize, pixelsize);
                        break;
                    case 3: 
                        g.fillRect(x*10, y*pixeldistance, pixelsize, pixelsize);
                        break;
                }
                boxQuantity++;
            }
        }
        System.out.println("width: " + frame.getWidth()/10 + " / bq: " + boxQuantity + " / psm: " + pixelsizemodifier);
        repaint();
    }
    
    
        public void keyPressed(KeyEvent e) {
            
            if (e.getKeyCode() == KeyEvent.VK_SPACE) {
                pixelsizemodifier++;
                
            }
            

        }

        @Override
        public void keyReleased(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_SPACE) {
                pixelsizemodifier++;
            }

        }

        @Override
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub

        
        }
}

【问题讨论】:

    标签: java swing graphics keylistener


    【解决方案1】:

    很多问题:

    1. 类名应以大写字符开头
    2. 类名应该是描述性的。 "main" 不遵循这些做法。
    3. 不要使用静态变量。类中的所有变量都应该是实例变量。实例变量可以通过类中的任何方法访问
    4. 无需定义“框架”变量。你的类不需要知道它所在的框架。
    5. 自定义绘画是通过覆盖 paintComponent(...) 而不是 paint() 来完成的。
    6. 自定义绘制应该只绘制组件的当前状态。它不应该改变状态。因此,您不应该在绘画方法中生成“随机”值。相反,您有一个生成随机值的方法,该值添加到二维数组中。然后paint方法遍历数组来绘制值的表示
    7. 切勿在绘画方法中调用 repaint()。这不是动画的完成方式。相反,您使用 Swing Timer 来安排动画。当 Timer 触发时,您从上面调用生成随机值的方法。然后该方法将调用重绘。
    8. 您不应该使用 KeyListener 来监听 KeyEvent。 Swing 旨在与Key Bindings 一起使用

    Swing Tutorial 包含以下部分:

    1. 自定义绘画
    2. 如何使用摆动计时器
    3. 如何使用键绑定。

    阅读教程以获取有关上述每个主题的示例。

    每当我按下空格键或任何其他键时,我尝试配置它都不会更改“pixelsizemodifier”变量

    最后,你的问题的原因:

        frame.getContentPane().add(new main());
        ...
        new main().go();
    

    您正在创建自定义类的两个实例。不要。

    您只需要一个实例。该实例需要添加到框架中,并且您需要在该实例上调用 go():

    您应该在类的构造函数中调用go() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 2012-12-26
      • 1970-01-01
      相关资源
      最近更新 更多