如何在java中调用Paint Component方法

时间:2016-03-04 19:44:09

标签: java graphics paintcomponent

如何调用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 
}

1 个答案:

答案 0 :(得分:1)

这是我根据您的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方法,这样我就可以将你的Timer Task的结束点传递给JPanel。

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

  6. 我在Timer Task中添加了另一个invokeLater方法。这可确保在Event Dispatch线程上重新绘制JPanel。

  7. 这是代码。我希望这些更改和描述可以帮助您更好地理解使用计时器任务。

    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);
            }
    
        }
    
    }