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();
}
});
}
}
答案 0 :(得分:2)
但我想通过使用doClick()方法触发paintComponent()!
当组件的属性发生变化时,Swing组件应足够智能以重新绘制自己。
例如,如果在JLabel上使用setText(...)
方法,则标签会使用指定的文本重新绘制自己。
因此,当您单击某个按钮时,您应该通过调用该类的方法来更改类的属性。然后在该方法中调用repaint()
,组件将重新绘制自己。
编辑:
n修改,以便paintComponent方法也执行与actionPerformed()执行的次数相同
代码有几个问题:
框架不可见,调用doClick()方法将无效,因为只有在框架可见时才会绘制组件。因此,动画代码需要在框架可见之后执行
您无法使用循环。将发生以下两件事之一:a)循环将执行得如此之快以至于您无法看到组件的增量绘制或b)将对RepaintManager进行repaint()请求,RepaintManager将每个请求合并为一个油漆要求。
如果你想做动画,那么你需要使用Swing Timer来安排动画。