我用 Java 創建了一個簡單的音樂節拍器。它通過按下一個蝴蝶形狀的按鈕來啟動和停止。我很想通過使按鈕/蝴蝶隨著節拍器節拍出現和消失來添加速度的視覺效果。
java.util.Timer 會是要走的路嗎?這是否適用于按鈕影像并且需要在脈沖時保持其功能?
非常感謝您對社區的建議和祝賀。
uj5u.com熱心網友回復:
java.util.Timer 會是要走的路嗎?
是的,這可以很容易地用于顯示脈動影像。當我之前完成此操作時,我在建構式中創建了一個正弦波常量陣列,并使用它們在計時器內設定了一個 alpha 組合。
這是否適用于按鈕影像并且需要在脈沖時保持其功能?
這可能雖然有點困難,因為按鈕并沒有真正呈現它自己,而是它的 componentUI,這里是 BasicButtonUI 的子類之一。
好吧,我可以在不弄亂componentUI的情況下做到這一點,但我不確定這是否是正確的方法:
import java.awt.AlphaComposite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
@SuppressWarnings("serial")
public class PulsingButton extends JPanel {
private static final int MAX_ALPHAS = 60;
private float alpha = 1.0f;
private JSpinner beatsPerMinSpinner = new JSpinner(new SpinnerNumberModel(60, 30, 120, 1));
private JButton button = new JButton("Button") {
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setComposite(((AlphaComposite)g2.getComposite()).derive(alpha));
super.paintComponent(g2);
};
};
private float[] alphas = new float[MAX_ALPHAS];
private Timer timer;
public PulsingButton() {
beatsPerMinSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
int value = ((Integer) beatsPerMinSpinner.getValue()).intValue();
setTimerDelay(value);
}
});
add(new JLabel("Beats Per Minute:"));
add(beatsPerMinSpinner);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Hello!");
}
});
add(button);
for (int i = 0; i < alphas.length; i ) {
double theta = (Math.PI * 2 * i) / alphas.length;
alphas[i] = (float) ((Math.cos(theta) 1) / 2.0);
}
int bpm = ((Integer) beatsPerMinSpinner.getValue()).intValue();
timer = new Timer(setTimerDelay(bpm), new TimerListener());
timer.start();
System.out.println(setTimerDelay(bpm) "");
}
private int setTimerDelay(int bpm) {
int milisecondsInMinute = 60 * 1000;
int delay = milisecondsInMinute / (bpm * alphas.length);
if (timer != null) {
timer.setDelay(delay);
}
return delay;
}
private class TimerListener implements ActionListener {
int index = 0;
@Override
public void actionPerformed(ActionEvent arg0) {
alpha = alphas[index];
index ;
index %= alphas.length;
repaint();
}
}
private static void createAndShowGui() {
PulsingButton mainPanel = new PulsingButton();
JFrame frame = new JFrame("PulsingButton");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/531313.html
標籤:爪哇按钮计时器脉冲
下一篇:ListView-記憶體不足例外
