为甚么我点击个文本框,paintComponent()方法就一直运行?

importjavax.swing.JFrame;importjavax.swing.JPanel;publicclassGgTestextendsJFrame{Gggg... import javax.swing.JFrame;
import javax.swing.JPanel;

public class GgTest extends JFrame{
Gg gg ;
public GgTest(){
gg =new Gg();
// JPanel x = new JPanel();
// x.add(gg);
this.getContentPane().add(gg);
// x.setOpaque(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setSize(350,540);
}

public static void main(String[] args) {
new GgTest();
}

}

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;

public class Gg extends JPanel{

String vv ="";
Timer timer ;
JTextField jtf;
JLabel jlabel;
ImageIcon x=null ;
JButton button;
Graphics g ;
public Gg(){
setFocusable(true);
jtf= new JTextField(10);
jtf.setBorder(new EmptyBorder(0,0,0,0));
jtf.setOpaque(false);
x = new ImageIcon(Gg.class.getResource("x.jpg"));
this.setLayout(null);
button =new JButton("保存图片");
button.setFont(new Font("",30,10));
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
savaImage();
}

});
this.setBackground(Color.blue );
button.setBounds(250, 420, 80, 30);
this.add(jtf);
this.add(button);
jtf.setBounds(89, 98, 100,17 );

}
public void paintComponent(Graphics g)
{
g.drawImage(x.getImage(), 0, 0,336,500, null);
System.out.println("xxs");
}
}
展开
 我来答
死后是好人
2011-08-25 · TA获得超过2638个赞
知道小有建树答主
回答量:628
采纳率:0%
帮助的人:964万
展开全部
我也不知道是什么原因,不过我意外发现:
只要把你public Gg()里的那句jtf.setOpaque(false);改成jtf.setOpaque(true);或者注释掉就可以了
所以得出结论,是你的界面在不断重构,相当于你拖动改变窗口大小,窗口重构了一样
你点击文本框,输入,都改变了文本框的属性,导致文本框重构,又同时因为jtf.setOpaque(false);要显示背景,所以触发了整个JPanel的重构,每次重构,当然要重新调用一遍 paintComponent()方法了
追问
可能是因为光标要在上面闪的原因吧,如果焦点不在文本框上,就不会刷新了,可是还要在文本框输入,不好办了……
追答
你原来的那句jtf.setOpaque(false);是想要让文本框不要盖住图像么?那么文本框被图像盖住怎么输入啊?
如果是为了让图片不要遮住文本框,jtf.setOpaque(true);
或者在之后添加this.setOpaque(false);//操作panel
都能达到效果,但是如果你要求图片盖住文本框貌似就没这么容易解决了
352qmgz713
2011-08-25 · TA获得超过147个赞
知道答主
回答量:528
采纳率:0%
帮助的人:317万
展开全部
没办法.没有哪个语言提供动态修改基础代码的功能,要么自己写个新的函数,里面用减运算;要么在此基础上加个变量控制,代码中根据标志值进行加或者减的运算;要么就像 cloudee那样办好了.

不过你如果这样想,明显是错误的,以后工作做多了你就会知道了,工作中最常用的方法就是在参数中加标志控制处理方法.
比如改成这样:
void Change(int j,boolean sub)
{
if (sub)
start=start-Double.parseDouble(Sweep_Pace.getText())*j;
else
start=start+Double.parseDouble(Sweep_Pace.getText())*j;
}
当然,标志不是非得用boolean,因为boolean只有两个值,如果你还想用乘除那就不行了,所以可以用Number类,比如byte、short、int等等做标志。
追问
我想改写原类的方法,可是底层的代码太长,现在功力不够,还看不懂……很无力……
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式