如何在Java中创建屏幕键盘?

6
我正在进行一个学校项目,需要创建一个虚拟智能手机,在电脑上运行。
我的问题是需要在屏幕上创建一个类似于智能手机的键盘,可以通过鼠标单击使用。我可以创建每个, 但这将需要很长时间。因此,我希望有人知道一种算法,可以创建所有按钮并正确地放置它们在屏幕上。
提前致谢 :)

你能使用HTML和JavaScript吗? - Ibu
1
那是一个巨大的学校项目。 - gbtimmon
你可以使用循环来简化创建所有按钮的过程。 - FThompson
1
http://www.roseindia.net/answers/viewqa/Swing-AWT/6311-virtual-onscreen-keyboard-project-using-java-and-swings.html - Alex W
1
@NiklasJensen 创建一个包含你的字符[a...z]的数组,并循环生成按钮。假设你想保持每个键的相同维度,这应该不难。 - Max
显示剩余4条评论
3个回答

9
您可以通过使用for循环来构建按钮。 每个键盘行一个循环是可行的方法。
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

这个基本的循环系统可以正常工作,但更优雅的方法是使用更多面向对象的方式来实现。


1
我不能说我对 setSize 调用和 setLocation 调用感到非常满意。 - Robin
这是答案中最不重要的部分;不能说它必须被踩。 - FThompson
2
在我看来,给一个显然还不太熟悉Java/Swing的人一个违反基本Swing原则的示例是应该被downvote的。既然那段代码已经消失了,我现在会取消我的downvote。 - Robin

7
这个简单的例子可能会对你有所帮助:

在此输入图片描述

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);
        }
    }
}

+1 非常好,尽管您可能不想扩展 JFrame 类,除非添加功能,因为这被认为是不良实践。 - David Kroukamp
1
另外,优先考虑使用Action而不是ActionListener,例如:https://dev59.com/3G025IYBdhLWcg3wyZEn#5797965。 - trashgod

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);

}

这是一个快速示例,展示如何实现它 :).

1
这将仅创建一行键按钮。我不知道有哪些智能手机的键盘布局是这样的。 - FThompson
2
这正是关键所在。这个示例演示了原则,但同时它不能直接用于他的作业中。我不会为某人的学校作业而做,并让他们免费获得学分。 - Nebri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接