如何调用paintComponent(Graphics g)方法??
var version = "0.0.0";
self.port.on("get-version", ver => { version = ver; alert(version); });
$("body").append("<div id='helpSection' class='overlay'>\
<p><b>Salesforce Overlay: " + version + "</b>\
//more paragraphs/text and such...
</p>\
</div>");
下面!这是更新的一个最小代码 我想简单地改变每一秒的终点 如何调用paintComponent(Graphics g)方法??
method(){
Timer timer = new Timer();
timer.schedule(new Class(), 1000,1000);
}
public void run() {
//invoke PaintComponent
}
答案 0 :(得分:1)
这是我根据您的GUI创建的GUI。
我对您的代码进行了很多更改。
我将您的代码解压缩到单独的GUI,JPanel和TimerTask类中。这种解压缩使您可以更容易地单独测试Java应用程序的每个部分。
我将主方法代码包装到Runnable中,并调用SwingUtilities invokeLater方法来启动Swing GUI。 invokeLater方法将Swing组件的创建和执行放在Event Dispatch thread上。 Oracle和我要求您通过调用invokeLater方法启动每个Swing应用程序。
在guiMethod方法中,我重新安排了JFrame代码,以便它以正确的顺序执行。最后调用setVisible方法。我使用pack方法创建JFrame。除非您创建绘图面板,否则您不应该指定Swing组件大小。在那里,您可以像在MyPanel类中一样设置绘图面板的大小。
我在你的NewPanel类中创建了一个setEndPoints方法,这样我就可以将你的Timer Task的结束点传递给JPanel。
我在paintComponent方法中添加了对super paintComponent的调用。这样可以确保清除绘图面板并且Swing绘制链完整无缺。
我在Timer Task中添加了另一个invokeLater方法。这可确保在Event Dispatch线程上重新绘制JPanel。
这是代码。我希望这些更改和描述可以帮助您更好地理解使用计时器任务。
package com.ggl.testing;
import java.awt.BasicStroke;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class SimpleTest {
private JFrame frame;
private NewPanel newPanel;
public void guiMethod() {
frame = new JFrame("Libra's");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
newPanel = new NewPanel();
newPanel.setEndPoints(200, 100, 100, 200);
frame.add(newPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
SimpleTest c = new SimpleTest();
c.guiMethod();
Timer timer = new Timer();
timer.schedule(c.new SimpleTimerTask(), 1000, 1000);
}
};
SwingUtilities.invokeLater(runnable);
}
public class NewPanel extends JPanel {
private static final long serialVersionUID = -4695412639313981349L;
private int x1, y1, x2, y2;
public NewPanel() {
this.setPreferredSize(new Dimension(250, 250));
}
public void setEndPoints(int x1, int y1, int x2, int y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setStroke(new BasicStroke(3));
g.drawLine(75, 75, 10, 10);
g.drawLine(75, 75, x1, y1);
g.drawLine(75, 75, x2, y2);
}
}
public class SimpleTimerTask extends TimerTask {
int count;
@Override
public void run() {
count += 5;
final int x1 = 200 + count;
final int y1 = 100 + count;
final int x2 = 100 + count;
final int y2 = 200 + count;
// repaint(); i want to invoke paint component method from here , simply
// to change the end point of line every second
Runnable runnable = new Runnable() {
@Override
public void run() {
newPanel.setEndPoints(x1, y1, x2, y2);
newPanel.repaint();
}
};
SwingUtilities.invokeLater(runnable);
}
}
}