gpt4 book ai didi

java - 如何在java中调用Paint组件方法

转载 作者:行者123 更新时间:2023-12-01 10:17:39 24 4
gpt4 key购买 nike

如何调用paintComponent(Graphics g)方法??

method(){
Timer timer = new Timer();
timer.schedule(new Class(), 1000,1000);
}
public void run() {
//invoke PaintComponent
}

这里!这是更新后的最小代码我想简单地每秒改变线的终点如何调用paintComponent(Graphics g)方法??

public class SimpleTest extends TimerTask {

JFrame frame;
int count ,x1,y1,x2,y2;
public void run() {

count+=5;
x1=count;
y1=count;
x2=count-1;
y2=count-1;
// repaint(); i want to invoke paintcomponent method from here , simply to change the end point of line every secd
}
void guiMethod(){
frame=new JFrame("Libra's");
frame.setBounds(50, 50, 250, 250);
frame.setVisible(true);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new NewPanel());
}
public static void main(String[] args){
SimpleTest c=new SimpleTest();
c.guiMethod();

Timer timer = new Timer();
timer.schedule(new SimpleTest(), 1000,1000);
}
}
class NewPanel extends JPanel{
SimpleTest obj=new SimpleTest();
@Override
protected void paintComponent(Graphics g){

Graphics2D g2=(Graphics2D)g;
g2.setStroke(new BasicStroke(3));

g.drawLine(120, 120, 70, 80);


g.drawLine(120, 120, obj.x1, obj.y1);

g.drawLine(120, 120, obj.x2, obj.y2);
}}

最佳答案

这是我根据您的 GUI 创建的 GUI。

GUI

我对您的代码做了很多更改。

  1. 我将您的代码解压到单独的 GUI、JPanel 和 TimerTask 类中。这种解包可以更轻松地单独测试 Java 应用程序的每个部分。

  2. 我将您的主要方法代码包装到 Runnable 中,并调用 SwingUtilities invokeLater 方法来启动您的 Swing GUI。 invokeLater 方法将 Swing 组件的创建和执行放在 Event Dispatch thread 上。 。 Oracle 和我要求您通过调用 invokeLater 方法来启动每个 Swing 应用程序。

  3. 在 guiMethod 方法中,我重新排列了 JFrame 代码,以便它能够按正确的顺序执行。最后调用 setVisible 方法。我使用 pack 方法来创建 JFrame。您根本不应该指定 Swing 组件的大小,除非您创建绘图面板。在那里,您可以设置绘图面板的大小,就像我在 MyPanel 类中所做的那样。

  4. 我在您的 NewPanel 类中创建了一个 setEndPoints 方法,以便我可以将端点从您的计时器任务传递到 JPanel。

  5. 我在您的paintComponent方法中添加了对 super paintComponent的调用。这可以确保绘图面板被清除并且 Swing 绘制链不间断且完整。

  6. 我向您的计时器任务添加了另一个 invokeLater 方法。这可确保 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);
}

}

}

关于java - 如何在java中调用Paint组件方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35804780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com