java mousewheel事件_java – 在MouseWheelMotion事件期间窗口变为空白

我编写了这个简单的程序来显示按键,绘制短语“Hello World”,其中一个光标移动(单​​击时带有一个跟踪模式),并循环显示“Hello World”中的颜色,当时鼠标滚轮滚动.但是这有一个问题:当鼠标滚轮滚动时,整个窗口变为空白(显示第一个使组件可见时的默认灰色),然后将重新绘制颜色变化(仅对于“Hello World”,似乎并不需要重绘整个框架.

发生空白的时间似乎与滚动鼠标滚轮的力相关联,如果我非常轻微地滚动,只有非常微小的时刻,所有内容都不会显示,但滚动非常难以使窗口变为空白2-3秒.

我尝试过双缓冲 – 认为这可能是某种屏幕闪烁 – 但它没有任何变化,我不知道是什么原因造成这种奇怪的效果.当车轮运动事件发生时,就好像正在加载帧图像一样. (是否有可能立即退出车轮事件以减少加载时间?(这只是我对可能的解决方案的猜测)).

代码如下.任何想法将不胜感激.

package keymouse;

import java.awt.*;

import java.awt.event.*;

import java.awt.image.BufferStrategy;

import java.util.LinkedList;

import javax.swing.JFrame;

public class KeyMouse implements KeyListener,

MouseMotionListener, MouseListener, MouseWheelListener, Runnable {

boolean trailMode = false;

boolean exists = false;

display window;

LinkedList wordList;

LinkedList trailList;

LinkedList colorList;

Point mousePoint;

int TRAIL_SIZE = 10;

boolean init = true;

int FONT_SIZE = 32;

int mouseY;

int mouseX;

int y;

int colorCount = 0;

public static void main(String[] args) {

KeyMouse k = new KeyMouse();

k.run();

}

public KeyMouse() {

window = new display();

window.addKeyListener(this);

window.addMouseMotionListener(this);

window.addMouseListener(this);

window.addMouseWheelListener(this);

window.setBackground(Color.WHITE);

window.setForeground(Color.BLACK);

wordList = new LinkedList();

trailList = new LinkedList();

colorList = new LinkedList();

colorList.add(Color.BLACK);

colorList.add(Color.BLUE);

colorList.add(Color.YELLOW);

colorList.add(Color.GREEN);

colorList.add(Color.PINK);

}

@Override

public void keyTyped(KeyEvent e) {

// do nothing

}

@Override

public void keyPressed(KeyEvent e) {

int keyCode;

if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {

stop();

}

keyCode = e.getKeyCode();

addMessage("Pressed:" + e.getKeyText(keyCode));

}

@Override

public void keyReleased(KeyEvent e) {

//do nothing

}

@Override

public void mouseDragged(MouseEvent e) {

Point p = new Point(e.getX(), e.getY());

addLocation(p);

}

@Override

public void mouseMoved(MouseEvent e) {

Point p = new Point(e.getX(), e.getY());

addLocation(p);

}

@Override

public void mouseClicked(MouseEvent e) {

}

@Override

public void mousePressed(MouseEvent e) {

trailMode = true;

}

@Override

public void mouseReleased(MouseEvent e) {

trailMode = false;

}

@Override

public void mouseEntered(MouseEvent e) {

//do nothing

}

@Override

public void mouseExited(MouseEvent e) {

//do nothing

}

@Override

public void mouseWheelMoved(MouseWheelEvent e) {

System.out.println(e.getWheelRotation());

colorCount++;

if (colorCount > 4) {

colorCount = 0;

}

window.setForeground((Color) colorList.get(colorCount));

}

@Override

public void run() {

window.createBufferStrategy(2);

BufferStrategy strategy = window.getBufferStrategy();

while (true) {

draw(strategy.getDrawGraphics());

strategy.show();

try {

Thread.sleep(20);

} catch (Exception ex) {

}

}

}

public void draw(Graphics g) {

//draw background

g.setColor(window.getBackground());

g.fillRect(0, 0, window.getWidth(), window.getHeight());

//draw Text

g.setColor(window.getForeground());

g.setFont(new Font("sansserif", Font.BOLD, 32));

int count = trailList.size();

if (trailList.size() > 1 && trailMode == false) {

count = 1;

}

if (exists == true) {

for (int i = 0; i < count; i++) {

Point p = (Point) trailList.get(i);

g.drawString("Hello World", p.x, p.y);

}

}

g.setColor(Color.BLACK);

y = 56;

for (int i = 0; i < wordList.size(); i++) {

String word = (String) wordList.get(i);

g.drawString((String) wordList.get(i), 100, y);

y += 32;

}

}

public void addMessage(String message) {

if (y >= window.getHeight()) {

wordList.remove(0);

}

wordList.add(message);

}

public void addLocation(Point h) {

exists = true;

trailList.addFirst(h);

if (trailList.size() > TRAIL_SIZE) {

trailList.removeLast();

}

}

public void printMessages() {

for (int i = 0; i < wordList.size(); i++) {

System.out.println(wordList.get(i));

}

}

private void stop() {

System.exit(0);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值