الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة مع ال keyListener

بدأه mr.beshoy في 15 مارس 2010 · 16 رد · 747 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هنا فى ال code التاليى :

الجزئية الأولى : أريد عندما أضغط على alt+T يتم فتح قائمة ال file تم عملها باستعمال ال setMenimonic()

الجزئية الثانية : و أريد أيضاً عندما أكتب حرف فى ال textfield يتم عرض هذا الحرف فى dialoog تم عملها أيضاً باستعمال الدالة getChar()

و لكن عندم أضفت الجزئية الثانية تم إبطال عمل الجزئية الأولى - أى عندما أضغط alt+t لا تنفتح القائمة open . ما الشكلة فى هذا ؟؟!!

-------------------------------------------------------------

الشفيرة :

-------------

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TestKeyBoard extends JFrame implements KeyListener {

    private JPanel panel, mainPanel;
    private JTextField textField;
    private JMenu fileMenu;
    private JMenuBar menuBar;
    private JMenuItem[] menuItems;
    private String[] menuItemNames = {"open", "save", "exit"};

    public TestKeyBoard() {
        panel = new JPanel(new BorderLayout());
        mainPanel = new JPanel(new FlowLayout());
        textField = new JTextField(10);
        textField.addKeyListener(this);
        mainPanel.add(textField);
        panel.add(mainPanel, BorderLayout.WEST);
        getContentPane().add(panel);
        ///////////////////////////////////////////////
        menuBar = new JMenuBar();
        fileMenu = new JMenu("file");
        fileMenu.addKeyListener(this);
        menuItems = new JMenuItem[menuItemNames.length];
        for (int i = 0; i < menuItemNames.length; ++i) {
            menuItems = new JMenuItem(menuItemNames);
            //   menuItems.addKeyListener(this);
            fileMenu.add(menuItems);
            menuBar.add(fileMenu);
        }
        setJMenuBar(menuBar);
    }

    public static void main(String[] args) {
        TestKeyBoard testKeyBoard = new TestKeyBoard();
        testKeyBoard.setDefaultCloseOperation(TestKeyBoard.EXIT_ON_CLOSE);
        testKeyBoard.setSize(new Dimension(600, 300));
        testKeyBoard.setLocationRelativeTo(null);
        testKeyBoard.setVisible(true);
    }

    public void keyTyped(KeyEvent e) {
        int id = e.getID();
        if (id == KeyEvent.KEY_TYPED) {
            char c = e.getKeyChar();
            JOptionPane.showMessageDialog(null, "The char you typed is:" + c);
        }
    }

    public void keyPressed(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
        if (e.isAltDown()) {
            fileMenu.setMnemonic(KeyEvent.VK_T);

        }
    }
}

شكراً

#2

لماذا تستعمل ALT+T؟؟ عادة يتم استعمال ALT زائد الحرف الأول من الكلمة، أي ALT+F

setMnemonic تسمح بتحديد الحرف الذي سيشغل القائمة عند الضغط عليه وعلى ALT، هذا يعني أنه لا داعي للتحقق من الضغط على ALT

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TestKeyBoard extends JFrame implements KeyListener {

	private JPanel panel, mainPanel;
	private JTextField textField;
	private JMenu fileMenu;
	private JMenuBar menuBar;
	private JMenuItem[] menuItems;
	private String[] menuItemNames = {"open", "save", "exit"};

	public TestKeyBoard() {
		panel = new JPanel(new BorderLayout());
		mainPanel = new JPanel(new FlowLayout());
		textField = new JTextField(10);
		textField.addKeyListener(this);
		mainPanel.add(textField);
		panel.add(mainPanel, BorderLayout.WEST);
		getContentPane().add(panel);
		///////////////////////////////////////////////
		menuBar = new JMenuBar();
		fileMenu = new JMenu("File");
		///////////////////////////////////////////////
		fileMenu.setMnemonic(KeyEvent.VK_F);
		///////////////////////////////////////////////

		fileMenu.addKeyListener(this);
		menuItems = new JMenuItem[menuItemNames.length];
		for (int i = 0; i < menuItemNames.length; ++i) {
			menuItems = new JMenuItem(menuItemNames);
			// menuItems.addKeyListener(this);
			fileMenu.add(menuItems);
			menuBar.add(fileMenu);
		}
		setJMenuBar(menuBar);
	}	

	public static void main(String[] args) {
		TestKeyBoard testKeyBoard = new TestKeyBoard();
		testKeyBoard.setDefaultCloseOperation(TestKeyBoard.EXIT_ON_CLOSE);
		testKeyBoard.setSize(new Dimension(600, 300));
		testKeyBoard.setLocationRelativeTo(null);
		testKeyBoard.setVisible(true);
	}

	public void keyTyped(KeyEvent e) {
		int id = e.getID();
		if (id == KeyEvent.KEY_TYPED) {
			char c = e.getKeyChar();
			JOptionPane.showMessageDialog(null, "The char you typed is:" + c);
		}
	}

	public void keyPressed(KeyEvent e) {}

	public void keyReleased(KeyEvent e) {}
}

تم تعديل هذه المشاركة بواسطة herch في 15 مارس 2010 في 18:30

#3

!!!!!!!! لم أفهم قصدك أخي العزيز بيشوي ,, وضح أكثر

تم تعديل هذه المشاركة بواسطة MKSoft في 15 مارس 2010 في 18:52

#4

المشكلة لم تُحل أخ عصام .

فعندما أضغط على Alt+F لا تنسدل القائمة file

--------------------------------------------------------------------------------

أعتقد فهمت قصدى أخ محمد

#5

القائمة تنسدل عندي

#6

عندما أضغط Alt+F بتظهر ال Char بتاعها فى ال MessageDialog و لا تنسدل القائمة

فما العمل؟؟

#7

هناك طريقة لاسدال القائمة يا بيشوي باستخدام التالي :

open.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.ALT_MASK));

VK_F : تعني حرف F

ALT_MASK : تعني الضغط على ALT.

تم تعديل هذه المشاركة بواسطة MKSoft في 15 مارس 2010 في 22:53

#8

ضع الكود المعدل.

#9

هذا الكود الذى لم يعمل رغم أنه نسخة من بتاعك

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TestKeyBoard extends JFrame implements KeyListener {

    private JPanel panel, mainPanel;
    private JTextField textField;
    private JMenu fileMenu;
    private JMenuBar menuBar;
    private JMenuItem[] menuItems;
    private String[] menuItemNames = {"open", "save", "exit"};

    public TestKeyBoard() {
        panel = new JPanel(new BorderLayout());
        mainPanel = new JPanel(new FlowLayout());
        textField = new JTextField(10);
        textField.addKeyListener(this);
        mainPanel.add(textField);
        panel.add(mainPanel, BorderLayout.WEST);
        getContentPane().add(panel);
        ///////////////////////////////////////////////
        menuBar = new JMenuBar();
        fileMenu = new JMenu("File");
        fileMenu.setMnemonic(KeyEvent.VK_F);
        ///////////////////////////////////////////////
        menuItems = new JMenuItem[menuItemNames.length];
        for (int i = 0; i < menuItemNames.length; ++i) {
            menuItems = new JMenuItem(menuItemNames);
            // menuItems.addKeyListener(this);
            fileMenu.add(menuItems);
            menuBar.add(fileMenu);
        }
        setJMenuBar(menuBar);
    }

    public static void main(String[] args) {
        TestKeyBoard testKeyBoard = new TestKeyBoard();
        testKeyBoard.setDefaultCloseOperation(TestKeyBoard.EXIT_ON_CLOSE);
        testKeyBoard.setSize(new Dimension(600, 300));
        testKeyBoard.setLocationRelativeTo(null);
        testKeyBoard.setVisible(true);
    }

    public void keyTyped(KeyEvent e) {
        int id = e.getID();
        if (id == KeyEvent.KEY_TYPED) {
            char c = e.getKeyChar();
            JOptionPane.showMessageDialog(null, "The char you typed is:" + c);
        }
    }

    public void keyPressed(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
    }
}
#10

القائمة تنسدل عندي

post-181903-12686835731336_thumb.png

جرب اقتراح الأخ MKSoft

#11

الطريقة الى قولت عليها يا أخ محمد خاصة بال MenuItem ليس بال Menu

حتى لو طبقتها على menu هيعطيك الخطا الشهير :

setAccelerator() is not defined for JMenu. Use setMnemonic() instead.

----------------------------------------------------------------------------------------------------------------------

معلش أرفق كودك يا مستر عصام اجربه مباشرة

تم تعديل هذه المشاركة بواسطة mr.beshoy في 15 مارس 2010 في 23:11

#12

لم أغير شيئا في الكود

#13

اهى تنسدل عندما تضغط alt+f ؟؟

----------------------------------------------

أنا للأسف لما بضغط Alt+F

بيظهرلى ال messageDialog و فيها رمز كده

#14

نعم، عند الضغط على alt+f. يظهر ال message dialog وتنسدل القائمة.

#15

لا انا عاوز ال MessageDialog لا تظهر الا عندما تكتب فى ال textfield .

يعنى بختصار أول ما تضغط alt+f لا تظهر ال messageDialog و تنسدل القائمة و إذا كتبت داخل ال textfield تظهر الMesssageDialog

شكرا

#16

ما دام ال textfield يمتلك ال focus فسيلتقط ال key event، وبالتالي سيظهر ال message dialog، ولا يوجد مكون آخر في برنامجك حتى تزيل ال focus من ال textfield وتمرره له.

#17

شكراً

مواضيع مشابهة