JButton的doClick()方法

时间:2017-01-03 17:01:35

标签: java swing jbutton

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 个答案:

答案 0 :(得分:2)

  

但我想通过使用doClick()方法触发paintComponent()!

当组件的属性发生变化时,Swing组件应足够智能以重新绘制自己。

例如,如果在JLabel上使用setText(...)方法,则标签会使用指定的文本重新绘制自己。

因此,当您单击某个按钮时,您应该通过调用该类的方法来更改类的属性。然后在该方法中调用repaint(),组件将重新绘制自己。

编辑:

  

n修改,以便paintComponent方法也执行与actionPerformed()执行的次数相同

代码有几个问题:

  1. 框架不可见,调用doClick()方法将无效,因为只有在框架可见时才会绘制组件。因此,动画代码需要在框架可见之后执行

  2. 您无法使用循环。将发生以下两件事之一:a)循环将执行得如此之快以至于您无法看到组件的增量绘制或b)将对RepaintManager进行repaint()请求,RepaintManager将每个请求合并为一个油漆要求。

  3. 如果你想做动画,那么你需要使用Swing Timer来安排动画。