Avatar billede ladbye Nybegynder
03. maj 2006 - 12:41 Der er 2 kommentarer og
1 løsning

Genvejstaster i simpelt program

Hej,

Jeg er igang med et simpelt program i Java, som et led i et programmeringsfag jeg har.

Programmet der simulerer interfacet på en mobiltelefon, har et tekstdisplay hvor der skal stå tal og simulerer et tlf.nr., en række knapper fra 0-9 og to knapper med funktionerne "Call" og "Clear". Desuden er der et statusfelt forneden, der ændrer sig når man trykker på Call og Clear.

Desuden er der også lavet en menu, med funktionen quit. Den har jeg endda fået lavet således at genvejstasten CRTL+Q aktiverer funktionen.

Nu er problemet blot at jeg ikke kan få den til at virke med andre taster også. Mit ønske er, at den kan lægges ind under metoden addButton, som en generel funktion.

SKal lige siges, at jeg har en class der hedder Phone der inderholde nogle simple funktioner, som denne klasse - KeyboardGUI - henviser til.

Har vedlagt koden nedenunder:

public class KeyboardGUI
{
    private Phone phone;
    private JFrame frame;
    private JTextField display;
    private JLabel status;
   
    public KeyboardGUI()
    {
        phone = new Phone();
        makeFrame();
    }

    private void makeFrame()
    {
        frame = new JFrame("Mobile Phone");
       
        JPanel contentPane = (JPanel)frame.getContentPane();
        contentPane.setLayout(new BorderLayout(6, 6));
        contentPane.setBorder(new EmptyBorder(6, 6, 6, 6));
       
        display = new JTextField();
       
        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(4, 3));
     
        addButton(buttonPanel,"1");
        addButton(buttonPanel,"2");
        addButton(buttonPanel,"3");
        addButton(buttonPanel,"4");
        addButton(buttonPanel,"5");
        addButton(buttonPanel,"6");
        addButton(buttonPanel,"7");
        addButton(buttonPanel,"8");
        addButton(buttonPanel,"9");
        addButton(buttonPanel,"Call");
        addButton(buttonPanel,"0");
        addButton(buttonPanel,"Clear");
       
        status = new JLabel("Enter phone number");
       
        makeMenuBar();
       
        contentPane.add(display, BorderLayout.NORTH);     
        contentPane.add(buttonPanel, BorderLayout.CENTER);
        contentPane.add(status, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
    }

    private void makeMenuBar()
    {
        final int SHORTCUT_MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
       
        JMenuBar menubar = new JMenuBar();
        frame.setJMenuBar(menubar);
       
        JMenu fileMenu = new JMenu("File");
        menubar.add(fileMenu);
       
        JMenuItem quitItem = new JMenuItem("Quit");
        quitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, SHORTCUT_MASK));
        quitItem.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
        });
       
        fileMenu.add(quitItem);
     
    }
       
    private void addButton(Container panel, String buttonText)
    {
        JButton button = new JButton(buttonText);
        if( buttonText.equals( "Call" ) ){
            button.addActionListener( new CallButtonListener() );
        }
        else if( buttonText.equals( "Clear" ) ){
            button.addActionListener( new ClearButtonListener() );
        }
        else {
            int number = Integer.parseInt( buttonText );
            button.addActionListener( new NumberButtonListener( number ));
        }
        panel.add(button);
    }

    private void redisplay()
    {
        int displayValue = phone.getDisplayValue();
        if( displayValue == 0 )
            display.setText( "" );
        else
            display.setText("" + displayValue );
    }
   
    class NumberButtonListener implements ActionListener
    {
        private int number;
       
        public NumberButtonListener( int number )
        {
            this.number = number;
        }
       
        public void actionPerformed( ActionEvent event )
        {
            phone.numberPressed(number);
            redisplay();
            status.setText( phone.getAction() );
        }
    }

    class CallButtonListener implements ActionListener
    {
        public void actionPerformed( ActionEvent event )
        {
            phone.call();
            redisplay();
            status.setText( phone.getAction() );
        }
    }

    class ClearButtonListener implements ActionListener
    {
        public void actionPerformed( ActionEvent event )
        {
            phone.clear();
            redisplay();
            status.setText( phone.getAction() );
        }
    }
}
Avatar billede _carsten Nybegynder
04. maj 2006 - 21:34 #1
I dit tilfælde ville jeg lave en ny KeyEventDispatcher, da det numeriske tastatur sandsynligvis uanset hvilken komponent der har focus (display, knapper, etc.)

Prøv at kigge på nedenstående eksempel



import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import javax.swing.JButton;


public class NewJFrame extends javax.swing.JFrame {

    public NewJFrame() {
        initComponents();
        addButtons();
       
        KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
            new KeyEventDispatcher() {
                public boolean dispatchKeyEvent(KeyEvent e) { 
                    int i = e.getKeyCode();

                    if(!display.isFocusOwner() ){
                        if(i >= 48 && i <= 57){
                            if(e.getID() == e.KEY_PRESSED){
                                b[i - 48].doClick();
                                display.setText(display.getText() + (i - 48));
                            }
                        }
                        if(i >= 96 && i <= 105){
                            if(e.getID() == e.KEY_PRESSED){
                                b[i - 96].doClick();
                                display.setText(display.getText() + (i - 96));
                            }
                        }
                            return false;
                    }
                    return false;
                }
        });
    }
   

    private void initComponents() {
        display = new javax.swing.JTextField();
        panel = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().add(display, java.awt.BorderLayout.NORTH);

        panel.setLayout(new java.awt.GridLayout(4, 3));

        getContentPane().add(panel, java.awt.BorderLayout.CENTER);

        pack();
    }
   

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }
   
    private void addButtons(){
        for (int i = 0; i < b.length; i++) {
            b[i] = new JButton("" + i);
            panel.add(b[i]);
        }
    }

    private javax.swing.JTextField display;
    private javax.swing.JPanel panel;
    private JButton[] b = new JButton[10];
}
Avatar billede _carsten Nybegynder
04. maj 2006 - 21:35 #2
sandsynligvis uanset

læses som
sandsynligvis skal fungere uanset
:)
Avatar billede ladbye Nybegynder
19. april 2007 - 15:00 #3
Lukker lige dette ældgamle spørgsmål ...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester