作っている音楽アプリのトラックバーを作っています。基本的には、JPanel 拡張クラス「TrackBar」で水平方向に移動する Rectangle2D であり、ActionListener は別のクラス「TrackBarAction」にあり、「TrackBar」クラス内のタイマーによって移動され、今回は「Toolbar」クラスで開始されます。再生ボタンと一時停止ボタンがあります。
- 私が抱えている問題は、それが動かないということです。コンソールにデバッグ出力を追加して、コードを読み取っているかどうかを確認しましたが、なんらかの理由で repaint() を行わないため、コードを読み取りますが、repaint() は行いません。
簡略化されたコードは次のとおりです。
public class Toolbar extends JPanel implements ActionListener {
public static boolean IS_PLAYING = false;
public Toolbar(){
(...)
pauseicon = new ImageIcon(getClass().getResource("Icons/Pause.png"));
playicon = new ImageIcon(getClass().getResource("Icons/Play.png"));
play = new JToggleButton(new ImageIcon(playicon.getImage().getScaledInstance(width, height, java.awt.Image.SCALE_SMOOTH)), false);
play.setOpaque(false);
play.setContentAreaFilled(false);
play.setBorderPainted(false);
play.addItemListener ( new ItemListener( ) {
@Override
public void itemStateChanged(ItemEvent e) {
if(play.isSelected()){
play.setIcon((Icon)new ImageIcon(pauseicon.getImage().getScaledInstance(width, height, java.awt.Image.SCALE_SMOOTH)));
IS_PLAYING = true;
MainFrame.tb.t.start(); // THIS is where timer is called
} else {
play.setIcon((Icon)new ImageIcon(playicon.getImage().getScaledInstance(width, height, java.awt.Image.SCALE_SMOOTH)));
IS_PLAYING = false;
MainFrame.tb.t.stop();
}
}});
(...)
} // end of constructor
} // end of class
次のクラスは Trackbar クラスです。
public class TrackBar extends JPanel{
private TrackBarAction tba = new TrackBarAction(this);
public static int TIME = 8;
public Timer t = new Timer(TIME, tba);
public static double x = 0, y = 0, velX = 0.5, velY = 0;
@Override
public void paintComponent(Graphics g){
System.out.println("1"); // debug
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
//g2d.drawRect((int)x, (int)y, 10, 800);
Rectangle2D r2d = new Rectangle2D.Double(x, y, 10.0, 800.0); // x,x, w, h
g2d.setPaint(Color.DARK_GRAY);
g2d.fill(r2d);
g2d.draw(r2d);
System.out.println("2"); // debug
}
}
次のクラスは、アクション リスナーを持つ TrackBarAction です。
public class TrackBarAction implements ActionListener{
private TrackBar tb;
public TrackBarAction(TrackBar tb){
this.tb = tb;
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("3");
// When it gets to the end, return to start point
if(tb.x == 1024){
tb.x = 0;
tb.y = 0;
}
tb.x += tb.velX;
tb.y += tb.velY;
tb.repaint();
System.out.println("4");
}
}
これはメインフレームです:
public class MainFrame extends JFrame {
public static ColourToolbar colourBar;
public static TrackBar tb;
public MainFrame(){
super("VIPE by Prestige WorldWide");
// Top colour toolbar for tones
colourBar = new ColourToolbar();
this.getContentPane().add(colourBar, BorderLayout.NORTH);
// The center where the drawing is done
ImagePanel bg = new ImagePanel();
bg.setLayout(new BorderLayout());
Dimension size = getPreferredSize();
size.setSize(1024,800); //w, h
bg.setPreferredSize(size);
this.getContentPane().add(bg, BorderLayout.CENTER);
tb = new TrackBar();
bg.add(tb, BorderLayout.CENTER);
//DrawBoard dboard = new DrawBoard();
//bg.add(dboard, BorderLayout.CENTER);
//Image bgimage = (new ImageIcon(getClass().getResource("Icons/background.jpg"))).getImage();
//JPanel bg = new JPanelWithBackground(bgimage);
//this.getContentPane().add(bg, BorderLayout.CENTER);
// The control toolbar where the settings and control buttons are.
Toolbar toolBar = new Toolbar();
this.getContentPane().add(toolBar, BorderLayout.SOUTH);
}
public static void main(String[] args){
MainFrame frame = new MainFrame();
frame.setBackground(Color.WHITE);
frame.setSize(1024,768);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
//frame.pack();
frame.setVisible(true);
}
}