0

GUI を作成したり、Java で描画したりしたことがなく、線を効率的に描画する方法が必要です。私のアプリでは、ユーザーに 8 つのボタンが提供されます。ボタンが押されると、ボタンが押された時間に対応するウィンドウに線が描画されます。現在、jpanel で paintComponent 関数をオーバーライドし、125 ミリ秒ごとに paint() 関数を呼び出しています (描画する幅が 240 ピクセルしかないため、その 240 ピクセルで 30 秒分の記録を維持したいと考えています)。それが実行されているハードウェアは追いつくことができず、ひどい/非常に途切れ途切れに見えます. 私が使用しているコードは次のとおりです。

jPanel1 = new javax.swing.JPanel() {
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Something cur = manager.getSomething(getCurrentState());
    for(int j=0; j<cur.getNumItems(); j++) {
      Item i1 = cur.getItem(j);
      for(int i = 0; i<i1.getLength(); i++) {
        int start = i1.getStartTime(i);
        int len = Math.max(0, (Math.min(i1.getStopTime(i), pix) - start));
        g.fillRect(start,j*22+5,len,5);
      }
    }
    g.drawLine(pix, 0, pix, 170);
  }
};

getItem(int) は、特定のボタンの情報を返します。getStartTime(int) は、ボタンが押された特定の期間の開始時刻を返します。getStopTime(int) は、ボタンが押されたときの特定の期間の停止時間を返します。pix = パネル上の現在のピクセル (したがって、タイムラインの 30 秒の 15 秒後であれば、pix は 120 になります)

最後に、125ms ごとに jpanel1.paint() を呼び出すタイマーがあります。

これを行うためのより良い方法はありますか、または他の提案はありますか? 私は実際の描画経験がないため、詳細な情報/ソースを提供してください. 前もって感謝します!

4

2 に答える 2

0

手動で呼び出したりメソッドを実行したりしないでください。paintpaintComponent

より良い結果を得るには、125ミリ秒ごとにパネルでinvalidate()その方法を試してみてください。repaint()

また、塗り直しや無効化に興味があるかもしれません

于 2013-01-02T06:42:41.513 に答える
0

JPanel の paintComponent 関数をオーバーライドします

public void paintComponent(Graphics g) {
        super.paintComponent(g)

        g.drawLine(this.x1, this.y1, this.x2, this.y2);
    }
于 2013-01-02T06:12:38.227 に答える