搭拉巴DLB 2018-03-12 06:01 采纳率: 66.7%
浏览 1778
已采纳

ubuntu下的java swing应用JTextField无法输入中文

在ubuntu中安装好了图形界面,搜狗输入法,企鹅fcitx,
可以在浏览器,系统控制台等地方输入中文,并且切换成英文输入。
但是启动好swing应用后不能在文本框里输入中文,输入法显示是搜狗输入法,输入法那里也无法通过快捷键切换。
有没有遇到类似情况的啊

  • 写回答

2条回答 默认 最新

  • Jarvis _love_dl 2018-03-12 06:51
    关注

    import java.awt.BorderLayout;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.event.CaretEvent;
    import javax.swing.event.CaretListener;

    public class Main {

    public static void main(String[] args) throws Exception {
        JFrame frame = new JFrame("JTextField 只能输入中文,字母,数字");
        JLabel label = new JLabel("输入:");
        JTextField textField = new JTextField(20);
        // 当 JTextField 中内容发生改变时触发
        textField.addCaretListener(new TextFieldInputListener());
    
        JPanel panel = new JPanel();
        panel.add(label);
        panel.add(textField);
    
        frame.add(panel, BorderLayout.CENTER);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    

    }

    class TextFieldInputListener implements CaretListener {

    @Override
    public void caretUpdate(CaretEvent e) {
        JTextField textField = (JTextField) e.getSource(); // 获得触发事件的 JTextField
        String text = textField.getText();
        if (text.length() == 0) {
            return;
        }
        char ch = text.charAt(text.length() - 1);
        if (!(ch >= '0' && ch <= '9' // 数字
                || ch >= 'A' && ch <= 'z' // 字母
                || ch >= '\u4E00' && ch <= '\u9FA5')) { // 中文,最常用的范围是 U+4E00~U+9FA5,也有使用 U+4E00~ U+9FFF 的,但目前 U+9FA6~U+9FFF 之间的字符还属于空码,暂时还未定义,但不能保证以后不会被定义
            JOptionPane.showMessageDialog(textField, "只能输入中文,字母,数字", "提示", JOptionPane.INFORMATION_MESSAGE);
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    // 去掉 JTextField 中的末尾字符
                    textField.setText(text.substring(0, text.length() - 1));
                }
            });
        }
    }
    

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 有偿求苍穹外卖环境配置
  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,