如何使用java中的swing在屏幕键盘上显示打字导师?哪种布局效果最好?

0 java keyboard swing grid-layout flowlayout

到目前为止我的代码如下:

\n\n
import javax.swing.JFrame;\nimport javax.swing.JButton;\nimport javax.swing.JPanel;\nimport java.awt.GridLayout;\nimport java.awt.FlowLayout;\n\npublic class GUI extends JFrame\n{\n    private JButton button;\n    private JPanel panel;\n    private static final String[][] key = { { "Esc", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "PrtSc", "Insert", "Delete", "Home", "End", "PgUp", "PgDn"}, { "3\\n2", "&", "\xc3\xa9", "\\"", "\'", "(", "\xc2\xa7", "\xc3\xa8", "!", "\xc3\xa7", "\xc3\xa0", ")", "-", "BkSpc", "NumLock", "/", "*", "-" }, { "Tab", "A", "Z", "E", "R", "T", "Y", "U", "I", "O", "P", "^", "$", "Enter", "7", "8", "9", "+" }, { "ShiftLock", "Q", "S", "D", "F", "G", "H", "J", "K", "L", "M", "\xc3\xb9", "\xc2\xb5", "4", "5", "6" }, { "Shift", "<", "W", "X", "C", "V", "B", "N", ",", ";", ":", "=", "Shift", "Up", "1", "2", "3", "Enter" }, { "Ctrl", "Fn", "Win", "Alt", "Space", "AltGr", "Context", "Ctrl", "Left", "Down", "Right", "0", "." } };\n\n    public GUI()\n    {\n       super( "Typing Tutor" );\n       setLayout( new GridLayout( key.length, 0 ) );\n\n       for ( int row = 0; row < key.length; row++)\n       {\n           panel = new JPanel();\n           panel.setLayout(new FlowLayout());\n           for ( int column = 0; column < key[ row ].length; column++ )\n           {\n              button = new JButton( key[ row ][ column ] );\n              panel.add( button );\n           }\n           add( panel );           \n       }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

=================================================== ===============

\n\n
import javax.swing.JFrame;\n\npublic class GUITest extends JFrame\n{\n   public static void main(String[] args)\n   {\n    GUI gui = new GUI();\n    gui.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );\n    gui.setSize( 1600, 250 ); \n    gui.setVisible( true );\n   }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

它在正确的行中显示键,但不完全按原样显示。例如,输入按钮不是矩形的,而是一排的。有什么建议可以改进吗?

\n\n

PS:我想做的是创建一个打字导师,它充当普通的文本编辑器,或者更好的是一个在其他程序之间传递击键的程序,同时我仍然可以在屏幕上看到可视键盘以供参考(和反馈)。只是为了确保我不必看真正的键盘并且可以随时练习盲打。如果您有更好的建议/替代方案或知道是否可能,请告诉我。

\n

mKo*_*bel 5

    \n
  • private JPanel[] panel;和 的数组private JButton[][] button;未初始化

  • \n
  • 键盘设计得不好,必须放一些不可见但占据或分割布局到三个独立 JPanel 的 JButton(再加上一个用于 ESC - F12 - 暂停/中断)

  • \n
  • 删除private JPanel[] panel;是无用的,将 JButtons 直接放到 JPanel 上,这使我对 Borders 有意义,但是随后您需要创建并分离具有与 for 相同数量的成员的数组private JButton[][] button;,您可以将 Border 作为具有四个数字的子数组(i,我,我,我)一位成员

  • \n
\n\n

快速修复,只需要进行微小的更改,如我最后两点所述

\n\n

在此输入图像描述

\n\n
import java.awt.EventQueue;\nimport java.awt.GridLayout;\nimport java.awt.event.ActionEvent;\nimport java.awt.event.ActionListener;\nimport javax.swing.JButton;\nimport javax.swing.JFrame;\nimport javax.swing.JPanel;\n\npublic class GUI extends JFrame {\n\n    private JFrame frame = new JFrame("Typing Tutor");\n    private JPanel parent = new JPanel(new GridLayout(0, 1));\n    private JPanel[] panel;\n    private JButton[][] button;\n    private static final String[][] key = {\n        {"Esc", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9",\n            "F10", "F11", "F12", "PrtSc", "Insert", "Delete", "Home",\n            "End", "PgUp", "PgDn"}, {"3\\n2", "&", "\xc3\xa9", "\\"", "\'", "(",\n            "\xc2\xa7", "\xc3\xa8", "!", "\xc3\xa7", "\xc3\xa0", ")", "-", "BkSpc", "NumLock", "/",\n            "*", "-"}, {"Tab", "A", "Z", "E", "R", "T", "Y", "U", "I",\n            "O", "P", "^", "$", "Enter", "7", "8", "9", "+"}, {"ShiftLock",\n            "Q", "S", "D", "F", "G", "H", "J", "K", "L", "M", "\xc3\xb9", "\xc2\xb5",\n            "4", "5", "6"}, {"Shift", "<", "W", "X", "C", "V", "B",\n            "N", ",", ";", ":", "=", "Shift", "Up", "1", "2", "3", "Enter"},\n        {"Ctrl", "Fn", "Win", "Alt", "Space", "AltGr", "Context",\n            "Ctrl", "Left", "Down", "Right", "0", "."}};\n\n    public GUI() {\n        super("Typing Tutor");\n        panel = new JPanel[6];\n        for (int row = 0; row < key.length; row++) {\n            panel[row] = new JPanel();\n            button = new JButton[20][20];\n            for (int column = 0; column < key[row].length; column++) {\n                button[row][column] = new JButton(key[row][column]);\n                button[row][column].putClientProperty("column", column);\n                button[row][column].putClientProperty("row", row);\n                button[row][column].putClientProperty("key", key[row][column]);\n                button[row][column].addActionListener(new MyActionListener());\n                panel[row].add(button[row][column]);\n            }\n            parent.add(panel[row]);\n        }\n        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n        add(parent);\n        pack();\n        setVisible(true);\n    }\n\n    public class MyActionListener implements ActionListener {\n\n        @Override\n        public void actionPerformed(ActionEvent e) {\n            JButton btn = (JButton) e.getSource();\n            System.out.println("clicked column --> " + btn.getClientProperty("column")\n                    + ", row --> " + btn.getClientProperty("row")\n                    + ", Key Typed --> " + btn.getClientProperty("key"));\n        }\n    }\n\n    public static void main(String[] args) {\n        EventQueue.invokeLater(new Runnable() {\n            @Override\n            public void run() {\n                GUI guI = new GUI();\n            }\n        });\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n