0

作っている音楽アプリのトラックバーを作っています。基本的には、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);

}

}
4

2 に答える 2

2

MadProgrammer が指摘したように、複雑な継承構造は不要です。

投稿されたコードを壊しているのは、タイマーが2番目のオフスクリーントラックバーの描画座標を操作していることです。TrackBarAction は継承によって TrackBar でもあるため、さまざまなアニメーション変数がすべて存在するため、コードは正常にコンパイルされます。ただし、実際に使用している元の TrackBar インスタンスではなく、レンダリングされていない TrackBar に属しています。

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

}

編集: これは、更新された TrackBarAction がどのように見えるかです。概念的に間違っているのは、バージョンの TrackBarAction のプリミティブ インスタンス変数が値渡しであり、オブジェクトのように参照渡しではないという考えです。したがって、バージョンで間違った変数を操作しています。

于 2013-02-28T23:02:49.477 に答える
1

これprivate static TrackBarAction tba = new TrackBarAction(new TrackBar());とこれ

TrackBar tb = new TrackBar();
bg.add(tb, BorderLayout.CENTER);

問題があります。が持つ参照TrackBarActionは、画面上の参照ではなくなります。

このように静的変数を使用することは、設計が悪く、問題があります...

public class TrackBar extends JPanel{

    private TrackBarAction tba;
    private int TIME = 8;

    private Timer t = new Timer(TIME, tba);
    private double x = 0, y = 0, velX = 0.5, velY = 0;

    public TrackBar() {
        tba =  = new TrackBarAction(this);
    }

    @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
    }
}

次に、 と対話する必要があるすべてのクラスは、TrackBar(操作する必要があるインスタンスの) 同じインスタンスを取得する必要があります。

于 2013-02-28T23:26:44.637 に答える