Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用计时器绘图不起作用_Java_Swing_Timer_Awt_Draw - Fatal编程技术网

Java 使用计时器绘图不起作用

Java 使用计时器绘图不起作用,java,swing,timer,awt,draw,Java,Swing,Timer,Awt,Draw,我用Java绘图有问题。我认为我的代码是正确的,但当我把它与计时器循环时,它不会打印任何东西。我想每秒钟重复doDrawing(g)方法。现在它将只打印文本prom system.out,而不打印图形 package src; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.A

我用Java绘图有问题。我认为我的代码是正确的,但当我把它与计时器循环时,它不会打印任何东西。我想每秒钟重复doDrawing(g)方法。现在它将只打印文本prom system.out,而不打印图形

package src;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import javax.swing.JPanel;
import javax.swing.Timer;

public class surface extends JPanel{

private void doDrawing(Graphics g){
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(Color.black);

    //souradnice stredu ciferniku
    final int sx = 250;
    final int sy = 250;

    // inicializace promennych
    int uhel = 0;
    int delka = 150;
    int xHodina,xMinuta,xSekunda,
        yHodina,yMinuta,ySekunda;


    // získání aktuálního času
     int HOUR = Calendar.getInstance().get(Calendar.HOUR);
     int MINUTE = Calendar.getInstance().get(Calendar.MINUTE) + 1;
     int SECOND = Calendar.getInstance().get(Calendar.SECOND) + 1 ;

    //výpočet jednotlivých úhlů pro jednotlivé ručičky a jejich vykreslení
     xSekunda = (int) ((int) sx + Math.round( Math.sin(( 6 * SECOND * Math.PI / 180)) * delka));
     ySekunda = (int) ((int) sy - Math.round( Math.cos(( 6 * SECOND * Math.PI / 180)) * delka));


    //vyhreslení ručiček
     g2d.drawLine(sx, sy, xSekunda, ySekunda);

    //info             
     System.out.print(" "+(6 * SECOND)+ "  "+ HOUR+"  "+MINUTE+"  "+SECOND+"     "+xSekunda+" "+ySekunda+"\n");
    }

@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);

    int delay = 1000; //milliseconds
    //Somewhere there is that problem .. 

      ActionListener taskPerformer = new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
              doDrawing(g);
          }
      };
      new Timer(delay, taskPerformer).start();
}   
}
问题就在这里

@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);

    int delay = 1000; //milliseconds
    //Somewhere there is that problem .. 

      ActionListener taskPerformer = new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
              doDrawing(g);
          }
      };
      new Timer(delay, taskPerformer).start();
    }   
}

切勿在部件内部启动计时器。这个方法只用于画画,什么也没有,我的意思是绝对没有别的

您应该在其他地方启动计时器,可能是在类的构造函数中,让它更改类的字段,然后调用
repaint()
。然后,paintComponent方法应该使用这些字段来决定要绘制的内容和位置

例如,您的
doDrawing()
方法(不带图形参数)可以创建Line2D,将其添加到
列表中,然后调用
repaint()
。然后,
paintComponent(…)
方法可以遍历此列表,绘制每一行:

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.swing.JPanel;
import javax.swing.Timer;

public class surface extends JPanel {

   private List<Line2D> lineList = new ArrayList<>();

   public surface() {
      int delay = 1000; // milliseconds
      // Somewhere there is that problem ..

      ActionListener taskPerformer = new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            doDrawing();
         }
      };
      new Timer(delay, taskPerformer).start();
   }

   private void doDrawing() {

      // souradnice stredu ciferniku
      final int sx = 250;
      final int sy = 250;

      // inicializace promennych
      int uhel = 0;
      int delka = 150;
      int xHodina, xMinuta, xSekunda, yHodina, yMinuta, ySekunda;

      // získání aktuálního času
      int HOUR = Calendar.getInstance().get(Calendar.HOUR);
      int MINUTE = Calendar.getInstance().get(Calendar.MINUTE) + 1;
      int SECOND = Calendar.getInstance().get(Calendar.SECOND) + 1;

      // výpočet jednotlivých úhlů pro jednotlivé ručičky a jejich vykreslení
      xSekunda = (int) ((int) sx + Math.round(Math
            .sin((6 * SECOND * Math.PI / 180)) * delka));
      ySekunda = (int) ((int) sy - Math.round(Math
            .cos((6 * SECOND * Math.PI / 180)) * delka));

      Line2D line = new Line2D.Double(sx, sy, xSekunda, ySekunda);
      lineList.add(line);
      repaint();

      // info
      System.out.print(" " + (6 * SECOND) + "  " + HOUR + "  " + MINUTE + "  "
            + SECOND + "     " + xSekunda + " " + ySekunda + "\n");
   }

   @Override
   public void paintComponent(final Graphics g) {
      super.paintComponent(g);
      Graphics2D g2d = (Graphics2D) g;
      g2d.setColor(Color.black);

      for (Line2D line2d : lineList) {
         g2d.draw(line2d);
      }

   }
}
导入java.awt.Color;
导入java.awt.Container;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.geom.Line2D;
导入java.util.ArrayList;
导入java.util.Calendar;
导入java.util.List;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类曲面扩展了JPanel{
private List lineList=new ArrayList();
公共场地(){
int delay=1000;//毫秒
//在某个地方有这个问题。。
ActionListener taskPerformer=新建ActionListener(){
已执行的公共无效操作(操作事件evt){
doDrawing();
}
};
新计时器(延迟,taskPerformer).start();
}
私有无效数据提取(){
//苏拉德尼斯街西弗尼库酒店
最终积分sx=250;
最终int sy=250;
//非专业化promennych
int-uhel=0;
int delka=150;
内特科迪纳、克斯米努塔、克塞昆达、伊霍迪纳、伊米努塔、伊塞昆达;
//茨卡尼·阿克图·莱尼·霍查苏
int HOUR=Calendar.getInstance().get(Calendar.HOUR);
int MINUTE=Calendar.getInstance().get(Calendar.MINUTE)+1;
int SECOND=Calendar.getInstance().get(Calendar.SECOND)+1;
//výpočet jednotlivýchlůpro jednotlivéručičky jejich vykreslení
xSekunda=(int)(int)sx+Math.round(Math
.sin((6*SECOND*Math.PI/180))*delka));
ySekunda=(int)(int)sy-Math.round(Math
.cos((6*SECOND*Math.PI/180))*delka));
Line2D line=新的Line2D.Double(sx、sy、xSekunda、ySekunda);
lineList.add(行);
重新油漆();
//信息
System.out.print(“+(6*秒)++”+小时+“+分钟+”)
+第二个+“”+xSekunda+“”+ySekunda+“\n”);
}
@凌驾
公共组件(最终图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
g2d.setColor(Color.black);
用于(Line2D Line2D:lineList){
g2d.绘制(line2d);
}
}
}

编辑my bad,您只想用此代码绘制一行,而不是一列行。如果是,请删除该列表,而是创建一个Line2D字段,该字段由计时器更改并由paintComponent绘制:

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Line2D;
import java.awt.geom.Line2D.Double;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

// !! Class names should begin with upper-case letter
public class Surface extends JPanel {
   private static final double DELKA = 150;
   private static final int SX = 250;
   private static final int SY = SX;
   private static final int DELAY = 1000;
   // private List<Line2D> lineList = new ArrayList<>();
   private Timer timer = new Timer(DELAY, new TaskPerformer());
   private Line2D line;

   public Surface() {
      timer.start();
   }

   private void doDrawing() {
      int xSekunda, ySekunda;

      int HOUR = Calendar.getInstance().get(Calendar.HOUR);
      int MINUTE = Calendar.getInstance().get(Calendar.MINUTE) + 1;
      int SECOND = Calendar.getInstance().get(Calendar.SECOND) + 1;

      xSekunda = (int) ((int) SX + Math.round(Math
            .sin((6 * SECOND * Math.PI / 180)) * DELKA));
      ySekunda = (int) ((int) SY - Math.round(Math
            .cos((6 * SECOND * Math.PI / 180)) * DELKA));

      // Line2D line = new Line2D.Double(SX, SY, xSekunda, ySekunda);
      line = new Line2D.Double(SX, SY, xSekunda, ySekunda);
      // lineList.add(line);
      repaint();

      // info
      System.out.print(" " + (6 * SECOND) + "  " + HOUR + "  " + MINUTE + "  "
            + SECOND + "     " + xSekunda + " " + ySekunda + "\n");
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(2 * SX, 2 * SY);
   }

   @Override
   public void paintComponent(final Graphics g) {
      super.paintComponent(g);
      Graphics2D g2d = (Graphics2D) g;
      g2d.setColor(Color.black);

      // to give smoother lines
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

      // iterate through our list and draw lines it holds
      if (line != null) {
         g2d.draw(line);
      }

   }

   private class TaskPerformer implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         if (!isShowing() && timer != null && timer.isRunning()) {
            timer.stop();
         } else {
            doDrawing();
         }
      }
   }

   private static void createAndShowGui() {
      Surface mainPanel = new Surface();

      JFrame frame = new JFrame("surface");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_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();
         }
      });
   }
}
导入java.awt.Color;
导入java.awt.Container;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.RenderingHints;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.geom.Line2D;
导入java.awt.geom.Line2D.Double;
导入java.util.ArrayList;
导入java.util.Calendar;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
导入javax.swing.Timer;
// !! 类名应以大写字母开头
公共类曲面扩展了JPanel{
专用静态最终双德尔卡=150;
专用静态最终int SX=250;
专用静态最终int SY=SX;
专用静态最终整数延迟=1000;
//private List lineList=new ArrayList();
专用计时器=新计时器(延迟,new TaskPerformer());
专用线路2D线;
公共场地(){
timer.start();
}
私有无效数据提取(){
伊斯昆达国际xSekunda;
int HOUR=Calendar.getInstance().get(Calendar.HOUR);
int MINUTE=Calendar.getInstance().get(Calendar.MINUTE)+1;
int SECOND=Calendar.getInstance().get(Calendar.SECOND)+1;
xSekunda=(int)(int)SX+Math.round(Math
.sin((6*SECOND*Math.PI/180))*DELKA));
ySekunda=(int)(int)SY-Math.round(Math
.cos((6*SECOND*Math.PI/180))*DELKA));
//Line2D line=新的Line2D.Double(SX、SY、xSekunda、ySekunda);
line=新Line2D.Double(SX、SY、xSekunda、ySekunda);
//lineList.add(行);
重新油漆();
//信息
System.out.print(“+(6*秒)++”+小时+“+分钟+”)
+第二个+“”+xSekunda+“”+ySekunda+“\n”);
}
@凌驾
公共维度getPreferredSize(){
如果(isPreferredSizeSet()){
返回super.getPreferredSize();
}
返回新尺寸(2*SX,2*SY);
}
@凌驾
公共组件(最终图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
g2d.setColor(Color.black);
//使线条更平滑
g2d.setRenderingHint(renderingHits.KEY\u抗锯齿,renderingHits.VALUE\u抗锯齿\u开启);
//反复浏览我们的列表并画出它所包含的线
如果(行!=null){
g2d.绘制(直线);
}
}
私有类TaskPerformer实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件e){
如果(!isShowing()&&timer!=null&&timer.isRunning()){
timer.stop();
}否则{
doDrawing();
}
}
}
专用静态vo