2012-11-28 48 views
5

私はコンピュータで実行するために仮想スマートフォンを作成する必要がある学校プロジェクトに取り組んでいます。Javaでオンスクリーンキーボードを作成するにはどうすればよいですか?

私の問題は、(スマートフォンのような)画面上にキーボードを作成する必要があることです。マウスをクリックして使用することができます。私はちょうどすべての単一のJButtonを作成することができますが、それは本当に長い時間がかかります。だから私は、誰かがすべてのボタンを作成し、それらを画面上に正しく配置する何らかのアルゴリズムを知っていることを知りました。

は、事前にありがとう:)

+0

あなたはhtmlとjavascriptを使用できます – Ibu

+1

これは1つの大規模な学校プロジェクトです。 – gbtimmon

+0

ループを使用して、これらのボタンをすべて作成することができます。 – Vulcan

答えて

9

あなたがforループを使用して、ボタンを構築することができます。キーボードの行ごとに1つのループがあります。

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 

これは、より多くのOOPアプローチによってよりエレガントに行うことができますが、この基本的なループシステムは機能します。

+1

私は本当に 'setSize'呼び出しと' setLocation'呼び出しに満足しているとは言いません – Robin

+0

答えの中で最も重要ではない部分です。それはdownvoteを必要と言うことはできません。 – Vulcan

+2

Java/Swingにはまだあまりよく知られていない人に与えられた、基本的なSwingの原則に違反する例では、下落を知る価値があります。そのコードがなくなったので、私のdownvoteを削除します – Robin

7

この単純な例では、あなたを助けるかもしれない:

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機能が追加されない限り、 'JFrame'クラスを拡張したくないかもしれませんが、これは悪い習慣とみなされます。 –

+1

+1また、 'ActionListener'よりも' Action'を、[example](http://stackoverflow.com/a/5797965/230513)と考えてください。 – trashgod

+2

+1ゼロがうまくいくかもしれません;) – 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); 

} 

これは、実行方法の高速例です:)。

+0

これは1つのキーボタンの行を作成します。私はそのように配置されたキーボードを備えたスマートフォンは知らない。 – Vulcan

+1

それはまさにポイントです。このサンプルは原理を示していますが、同時に彼の任務に縛られるだけではありません。私は誰かの学校の譲渡をしないで、無料でクレジットを得ることができます。 – Nebri

関連する問題