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)

最后我有一个计时器,它每 125 毫秒调用一次 jpanel1.paint()。

有没有更好的方法来做到这一点,或者有没有人有任何其他建议?请提供详细的信息/来源,因为我没有任何真正的绘图经验。提前致谢!

4

2 回答 2

0

你不应该手动调用或paint方法。paintComponent

为了获得更好的结果,您可以在每 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 回答