jbutton的doclick()方法触发actionperformed方法,但是我想使用doclick()方法触发paintcomponent()!请帮帮我!
这就是建议?这里有一个标签,每次执行doclick()方法的操作时,它的文本都会被更改。但不幸的是,paintcomponent方法的执行次数与actionperformed()方法不同。这只是建议作为答案的代码。实际上,当从文件中读取数据并根据文本文件中的数据绘制不同的形状时,我想触发doclick()方法!
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class myFrame {
JFrame jFrame;
myPanel bpanel;
JButton jbutton;
int radius;
JLabel label;
public myFrame() {
jFrame=new JFrame();
bpanel=new myPanel();
jbutton=new JButton("presss");
radius=50;
label=new JLabel(radius+" ");
bpanel.add(jbutton);
bpanel.add(label);
jbutton.addActionListener(new myButtonListener());
for (int i=0; i< 5; i++)
jbutton.doClick();
jFrame.getContentPane().add(bpanel);
jFrame.pack();
jFrame.setVisible(true);
}
public class myPanel extends JPanel {
public myPanel() {
setBackground(Color.cyan);
setPreferredSize(new Dimension(300,400));
}
public void paintComponent(Graphics g) {
System.out.println("paint component triggered");
super.paintComponent(g);
g.drawOval(0,0,radius,radius);
}
}
private class myButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
radius=radius+20;
label.setText(radius+" ");
bpanel.repaint();
System.out.println("mouse click event triggered");
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new myFrame();
}
});
}
}
1条答案
按热度按时间fykwrbwg1#
但是我想使用doclick()方法触发paintcomponent()!
swing组件应该足够聪明,可以在组件的属性更改时重新绘制自己。
例如,如果您使用
setText(...)
方法,则标签将使用指定的文本重新绘制自身。因此,当您单击一个按钮时,您应该只是通过调用类的方法来更改类的属性。然后在该方法中调用
repaint()
组件将重新绘制自身。编辑:
n修改,使paintcomponent方法的执行次数与actionperformed()的执行次数相同
代码有几个问题:
框架不可见调用doclick()方法将没有效果,因为只有在框架可见时才会绘制组件。所以动画代码需要在帧可见之后执行
你不能使用循环。有两种情况会发生:a)循环执行得太快,以至于看不到组件的增量绘制;或者b)repaint()请求将发送给repaintmanager,repaintmanager将把每个请求合并成一个单独的绘制请求。
如果要制作动画,则需要使用摆动计时器来安排动画。