doclick()方法

wb1gzix0  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(273)

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();
            }
        }); 
 }

}

fykwrbwg

fykwrbwg1#

但是我想使用doclick()方法触发paintcomponent()!
swing组件应该足够聪明,可以在组件的属性更改时重新绘制自己。
例如,如果您使用 setText(...) 方法,则标签将使用指定的文本重新绘制自身。
因此,当您单击一个按钮时,您应该只是通过调用类的方法来更改类的属性。然后在该方法中调用 repaint() 组件将重新绘制自身。
编辑:
n修改,使paintcomponent方法的执行次数与actionperformed()的执行次数相同
代码有几个问题:
框架不可见调用doclick()方法将没有效果,因为只有在框架可见时才会绘制组件。所以动画代码需要在帧可见之后执行
你不能使用循环。有两种情况会发生:a)循环执行得太快,以至于看不到组件的增量绘制;或者b)repaint()请求将发送给repaintmanager,repaintmanager将把每个请求合并成一个单独的绘制请求。
如果要制作动画,则需要使用摆动计时器来安排动画。

相关问题