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