Java Swing汉字输入问题

u010997460 2014-06-24 08:57:52
自从JDK1.7开始,Java Swing的输入控件 (如 JTextField等)在用拼音法输入汉字的时候,在输入确定之前,其会把汉字的拼音放置于输入控件内,当输入确定时,其又会将汉字替换掉控件内的拼音,我觉得这个做法很不好,而且也没有什么必要这么做。
我观察了其它多种语言的文本框控件,都不是按这种思路实现的,人家的实现方式都是:用拼音输入汉字时,拼音并不会出现在文本框内,当输入确定时,直接把汉字放入到文本框内。个人觉得这种思路才是对的。
就目前JDK(1.7及1.8)的这种实现思路,如下的功能是无法实现的:有两个文本框,要求实现:用拼音法输入汉字,当在第一个文本框输入时,实时检查该文本框内的字符数量,如果该文本框内字符的数量超过指定的值,那么程序能够自动将多余的字符放入到第二个文本框内,并且同时要求光标跳到当前输入字符或字符串的尾部。
以上是个人的见解,如有不对,希望大家指教。
...全文
948 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010997460 2014-07-03
  • 打赏
  • 举报
回复
7楼的朋友,你好,非常感谢。 你给的程序确实是实现了我说的功能,但是该程序存在一个弊端,就比如拿搜狗拼音输入法输入汉字来说吧,当输入汉字的时候,确定输入时不用空格键,而是用鼠标左键点击的方式做输入确定,则此时第一个文本框内多出的字符并不会被放入到第二个文本框,并且此时的光标会继续在第一个文本框内,如果此时用ctrl+shift方式将输入法切换到英文输入时,则此时在第一个文本内输入再多的字母或数字或其它非空格的字符,程序都不会截掉第一个文本框内多余的字符(只要不按空格键)。 个人觉得这种将拼音放入输入控件内的做法有些多余(这或许是我个人认知能力有限,没能看到它的好处),而且这种形式在某些特定情况下也给写程序的人带来了不必要的麻烦。 另外,程序是直接贴进来的,提交上去之后程序里的除了回车之外的其它所有段前段后的空白字符都被过滤掉了,所以程序显得有些乱,不过同样谢谢你的提醒。
  • 打赏
  • 举报
回复
1.7实现你说的那种需求!稍微改下你的代码! 另外你代码 写的也太乱了。

import java.awt.event.InputMethodEvent;
import java.awt.event.InputMethodListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.*;

public class A {
	int count = 10;//文本框1的字符数量控制
	JFrame javaFrame = new JFrame("JAVA窗体");
	JPanel javaZongPanel = new JPanel();
	JTextField javaTextField1 = new JTextField();
	JTextField javaTextField2 = new JTextField();

	MyKeyListener myKeyListener = new MyKeyListener();
	private boolean fromInputMethod = false;

	public A() {
		javaFrame.setBounds(200, 150, 500, 300);
		javaTextField1.setBounds(20, 50, 400, 20);
		javaTextField2.setBounds(20, 80, 400, 20);
		javaFrame.setLayout(null);
		javaTextField1.addKeyListener(myKeyListener);
		javaTextField1.addInputMethodListener(new InputMethodListener() {
			@Override
			public void inputMethodTextChanged(InputMethodEvent event) {
				fromInputMethod = true;
			}
			
			@Override
			public void caretPositionChanged(InputMethodEvent event) {
				// do nothing
			}
		});

		javaFrame.add(javaTextField1);
		javaFrame.add(javaTextField2);

		javaFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		javaFrame.setVisible(true);
	}


	class MyKeyListener implements KeyListener {
		int position = 0;
		String newStr = null;

		public void keyReleased(KeyEvent e) {
			if (32 == e.getKeyCode()) {
				fromInputMethod = false;
			}
			if (fromInputMethod) return;
			
			newStr = javaTextField1.getText();
			
			if (newStr.length() > count) {
				position = javaTextField1.getCaretPosition();
				javaTextField1.setText(newStr.substring(0, count));
				javaTextField2.setText(newStr.substring(count, newStr.length())+javaTextField2.getText());
				if (position >= count) {
					javaTextField2.requestFocus();
					javaTextField2.setCaretPosition(position-count);
				}else{
					javaTextField1.setCaretPosition(position);
				}
			}
		}

		public void keyPressed(KeyEvent e) {
		}

		public void keyTyped(KeyEvent e) {
		}
	}

	public static void main(String[] args) {
		new A();
	}
}
u010997460 2014-06-27
  • 打赏
  • 举报
回复
三楼的朋友,你好。 以下我写了段测试程序,该程序在JDk1.6中可以实现我上述所说的功能,但同样这段程序在JDk1.7及以后的版本中就不能实现了,你可以试一下。 你说目前java的实现方案可以实现我所说的功能,能不能麻烦你写一下代码发出来学习学习,先感谢了。 import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.*; public class A { public static void main(String[] args) { new A(); } int count=10;//文本框1的字符数量控制 JFrame javaFrame=new JFrame("JAVA窗体"); JPanel javaZongPanel=new JPanel(); JTextField javaTextField1=new JTextField(); JTextField javaTextField2=new JTextField(); MyKeyListener myKeyListener=new MyKeyListener(); public A() { javaFrame.setBounds(200, 150, 500, 300); javaTextField1.setBounds(20, 50, 400, 20); javaTextField2.setBounds(20, 80, 400, 20); javaFrame.setLayout(null); javaTextField1.addKeyListener(myKeyListener); javaFrame.add(javaTextField1); javaFrame.add(javaTextField2); javaFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); javaFrame.setVisible(true); } class MyKeyListener implements KeyListener { int position=0; String newStr=null; public void keyReleased(KeyEvent e) { newStr=javaTextField1.getText(); if(newStr.length()>count) { position=javaTextField1.getCaretPosition(); javaTextField1.setText(newStr.substring(0, count)); javaTextField2.setText(newStr.substring(count, newStr.length())+javaTextField2.getText()); if(position>=count) { javaTextField2.requestFocus(); javaTextField2.setCaretPosition(position-count); } else { javaTextField1.setCaretPosition(position); } } } public void keyPressed(KeyEvent e) { } public void keyTyped(KeyEvent e) { } } }
u010997460 2014-06-27
  • 打赏
  • 举报
回复
二楼的朋友,你好。 至少在用搜狗拼音输入法做输入时,如果你想输入的确实是拼音(或者是英文单词),你只需在输完后按回车键,即可将拼音(或者是英文单词)输入到文本框中,而不必改变输入法。
业余草 2014-06-27
  • 打赏
  • 举报
回复
本人表示jdk1.7我还没有使用过呢
  • 打赏
  • 举报
回复
chrome的输入框也是这样的,我觉的没什么问题啊。 也能实现你说的那种需求啊!
逍遥jc 2014-06-26
  • 打赏
  • 举报
回复
我想知道的按照其它语言的输入方式。我是不是输入英文还得切换输入法呀?我个人认为是java的处理方式妥当。
lliiqiang 2014-06-26
  • 打赏
  • 举报
回复
java有拼音和汉字转换类.

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧