Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > UP with LEFT


Автор: Rusico 26.8.2004, 17:14
Здравствуйте, даже не знаю с чего начать. Вопрос наверное глупый, однака где искал ненашёл.

Хочу чтоб моё приложение реагировало на события от клавы, что прекрасно работает, но ещё больше мне хочется чтоб оно реагировало на нажатие комбинаций клавиш, таких как UP одновременно с LEFT или RIGHT.

Может кто сталкивался с похожей проблемой? HELP!
ШПАШИБО.

Автор: Domestic Cat 26.8.2004, 17:23
Вот все что пришло в голову:

Код

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

public class test extends JFrame implements KeyListener
{
   JTextArea area = new JTextArea(2, 30);
   
   private boolean isUpPressed = false;
   private boolean isRightPressed = false;
           
   public test()
   {
       setSize(300, 300);
       
       JPanel panel = new JPanel();
       panel.setLayout(new BorderLayout());
       panel.add(area, BorderLayout.NORTH);
       JPanel panel2 = new JPanel();
       JButton but = new JButton("  ");
       panel2.add(but);
       getContentPane().add(panel2, BorderLayout.CENTER);
       getContentPane().add(panel, BorderLayout.NORTH);
       but.addKeyListener(this);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
       setVisible(true);
   }

   public void keyPressed(KeyEvent ke)
   {
       if (ke.getKeyCode() == KeyEvent.VK_UP)
       {
           isUpPressed = true;
       } else
       if (ke.getKeyCode() == KeyEvent.VK_RIGHT)
       {
           isRightPressed = true;
       }
       if (isUpPressed && isRightPressed)
       {
           area.setText("You pressed up and right arrows!!!");
       }
   }
   
   public void keyReleased(KeyEvent ke)
   {
       if (ke.getKeyCode() == KeyEvent.VK_UP)
       {
           isUpPressed = false;
       } else
       if (ke.getKeyCode() == KeyEvent.VK_RIGHT)
       {
           isRightPressed = false;
       }
   }
   
   public void keyTyped(KeyEvent ke)
   {
       
   }
   
   public static void main(String [] arguments)
   {
       new test();
   }
}



По идее, должен быть способ попроще?

Автор: Rusico 26.8.2004, 17:26
ЩА попробую, спасибо.

Автор: Rusico 26.8.2004, 17:48
К сожалению не работает, если я конечно всё правильно сделал.

Автор: Domestic Cat 26.8.2004, 17:54
? Код работает, в примере нужно фокус кнопке отдать (нажать на нее), тогда кей листенер
заработает.

Автор: Rusico 26.8.2004, 18:01
Щаз объясню: я пытаюсь написать маленькую програмку на java 3D, там кубик летает в 3-х мерном пространстве, а управляю я им по средствам клавиатуры, класс, который осуществляет его навигацию обрабатывает событие немного по другому:

import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.BitSet;
import java.util.*;

import javax.media.j3d.*;
import javax.vecmath.*;

import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.image.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.loaders.objectfile.ObjectFile;
import com.sun.j3d.loaders.Scene;

public class Navigator extends Behavior
{
private WakeupCondition wupcon;
private TransformGroup transform;

public Navigator(TransformGroup tr)
{
transform = tr;
WakeupOnAWTEvent wupevent = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);
WakeupCriterion[] wupcrit = {wupevent};
wupcon = new WakeupOr(wupcrit);
}

public void initialize()
{
wakeupOn(wupcon);
}
public void processStimulus(Enumeration detected)
{
while(detected.hasMoreElements())
{
WakeupCriterion wupcrit = (WakeupCriterion)detected.nextElement();
if(wupcrit instanceof WakeupOnAWTEvent)
{
WakeupOnAWTEvent awtevent = (WakeupOnAWTEvent)wupcrit;
AWTEvent[] events = awtevent.getAWTEvent();
moveShape(events);
}
}
wakeupOn(wupcon);
}

public void moveShape(AWTEvent[] events)
{
boolean isForvPressed = false;
boolean isPrevPressed = false;
boolean isLeftPressed = false;
boolean isRighPressed = false;
boolean isUpPressed = false;
boolean isDownPressed = false;

for(int x=0;x<events.length;x++)
{
if(events[x] instanceof KeyEvent)
{
KeyEvent keyevent = (KeyEvent)events[x];
int keyCode = keyevent.getKeyCode();
if(keyevent.getID() == KeyEvent.KEY_PRESSED)
{
Transform3D trans = new Transform3D();
transform.getTransform(trans);
Vector3f trVector = new Vector3f();
trans.get(trVector);
if(keyCode == KeyEvent.VK_LEFT){isLeftPressed = true;}
if(keyCode == KeyEvent.VK_UP){isForvPressed = true;}
if(isLeftPressed && isForvPressed){System.out.println("YES");}
}
if(keyevent.getID() == KeyEvent.KEY_RELEASED)
{
if(keyCode == KeyEvent.VK_LEFT){isLeftPressed = false;}
if(keyCode == KeyEvent.VK_UP){isForvPressed = false;}
}
}
}
}
}
}
}

Автор: Domestic Cat 26.8.2004, 18:03
Тут не сработает; нужно помещать этот код в keyPressed, keyReleased.

Автор: Rusico 26.8.2004, 18:07
Ладно, всё равно спасибо smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)