2012-11-28 17 views
5

Sto lavorando a un progetto scolastico in cui dobbiamo creare uno smartphone virtuale, da eseguire su un computer.Come posso creare una tastiera su schermo in java?

Il mio problema è che ho bisogno di creare una tastiera sullo schermo (come su uno smartphone), che è possibile utilizzare facendo clic con il mouse. Potrei creare ogni singolo JButton, ma ci vorrà molto tempo. Quindi ero eccitato dal fatto che qualcuno conoscesse una sorta di algoritmo che crea tutti i pulsanti e li posiziona correttamente sullo schermo.

Grazie in anticipo :)

+0

è possibile utilizzare html e javascript – Ibu

+1

Questo è un progetto di grande scuola. – gbtimmon

+0

È possibile utilizzare un ciclo semplicemente per la creazione di tutti quei pulsanti. – Vulcan

risposta

9

È possibile costruire i pulsanti mediante l'utilizzo di cicli for. Un ciclo per ogni fila di tastiere è un approccio plausibile.

String row1 = "1234567890"; 
String row2 = "qwertyuiop"; 
// and so forth 
String[] rows = { row1, row2, .. }; 
for (int i = 0; i < rows.length; i++) { 
    char[] keys = rows[i].toCharArray(); 
    for (int j = 0; i < keys.length; j++) { 
     JButton button = new JButton(Character.toString(keys[j])); 
     // add button 
    } 
} 
// add special buttons like space bar 

questo potrebbe essere fatto più elegantemente attraverso un approccio più OOP, ma questo sistema ad anello di base funzionerà.

+1

Non posso dire che sono molto soddisfatto della chiamata 'setSize' e della chiamata' setLocation' – Robin

+0

È la parte meno importante della risposta; non posso dire che sia necessario un downvote. – Vulcan

+2

Un esempio che viola i principi Swing di base, dato a qualcuno che ovviamente non ha ancora molta dimestichezza con Java/Swing, merita una nota negativa. Rimuoverò il mio downvote ora che quel codice è scomparso – Robin

7

Questo semplice esempio potrebbe aiutare:

enter image description here

import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.Point; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 


@SuppressWarnings("serial") 
public class MainFrame extends JFrame 
{ 
    private JTextField txt; 
    private PopUpKeyboard keyboard; 

    public MainFrame() 
    { 
     super("pop-up keyboard"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     txt = new JTextField(20); 
     keyboard = new PopUpKeyboard(txt); 

     txt.addMouseListener(new MouseAdapter() 
     { 
      @Override 
      public void mouseClicked(MouseEvent e) 
      { 
       Point p = txt.getLocationOnScreen(); 
       p.y += 30; 
       keyboard.setLocation(p); 
       keyboard.setVisible(true); 
      } 
     }); 
     setLayout(new FlowLayout()); 
     add(txt); 

     pack(); 
     setLocationByPlatform(true); 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new MainFrame().setVisible(true); 
      } 
     }); 
    } 

    private class PopUpKeyboard extends JDialog implements ActionListener 
    { 
     private JTextField txt; 

     public PopUpKeyboard(JTextField txt) 
     { 
      this.txt = txt; 
      setLayout(new GridLayout(3, 3)); 
      for(int i = 1; i <= 9; i++) createButton(Integer.toString(i)); 
      pack(); 
     } 

     private void createButton(String label) 
     { 
      JButton btn = new JButton(label); 
      btn.addActionListener(this); 
      btn.setFocusPainted(false); 
      btn.setPreferredSize(new Dimension(100, 100)); 
      Font font = btn.getFont(); 
      float size = font.getSize() + 15.0f; 
      btn.setFont(font.deriveFont(size)); 
      add(btn); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      String actionCommand = e.getActionCommand(); 
      txt.setText(txt.getText() + actionCommand); 
     } 
    } 
} 
+0

+1 molto bello anche se non si potrebbe desiderare di estendere la classe 'JFrame' a meno che non aggiunga funzionalità, in quanto ciò è considerato una cattiva pratica. –

+1

+1 Considera anche "Azione" preferenziale a "ActionListener", per [esempio] (http://stackoverflow.com/a/5797965/230513). – trashgod

+2

+1 Zero potrebbe essere bello;) – MadProgrammer

3
/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    String alphabet = "abcdefghijklmnopqrstuvwxyz"; 

    JFrame myFrame = new JFrame(); 
    JPanel myPanel = new JPanel(); 

    for (int i = 0; i < alphabet.length(); i++) { 

     myPanel.add(new JButton(alphabet.substring(i, i + 1))); 
    } 

    myFrame.add(myPanel); 
    myFrame.pack(); 
    myFrame.setVisible(true); 

} 

Questo è un esempio veloce di come farlo :).

+0

Questo creerà solo una riga di pulsanti chiave. Non conosco nessuno smartphone con le loro tastiere disposte in questo modo. – Vulcan

+1

questo è esattamente il punto. Questo esempio dimostra il principio ma allo stesso tempo non può essere semplicemente inserito nel suo incarico. Non ho intenzione di fare l'incarico di scuola di qualcuno e consentire loro di ottenere il credito gratuitamente. – Nebri

Problemi correlati