-5
  1. Points次々と見たいのですが、一点しか見えません。すべてを見るために私が変更するのは何Pointsですか?
  2. には、System.out10回の「set」と2回の「paintComponent」が表示されます。セットが呼び出されるたびに「paintComponente」を変更するために何を変更する必要がありますか?

================================================== ================================

public class exampe extends JPanel  
{
    int x; 
    int y;

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

        Graphics2D g2 = (Graphics2D) g;
        g2.fillOval(x-2,y-2,4,4);
        System.out.println("paintComponent");        
    }

    public void set(int X, int Y)
    {
        x = X;
        y = Y;
        System.out.println("set");
        super.repaint();
    }

    public static void main(String args[]) 
    {   
        int e=1;

        JFrame frame = new JFrame("TEST");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        exampe ex= new exampe();
        JScrollPane scroll = new JScrollPane(ex);
        frame.getContentPane().add(scroll);

        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        for(int i=0; i< 10; ++i)
            ex.set(e+i,e+i);         
    }
}
4

2 に答える 2

6

*前回の更新しか表示されなかった理由についての簡単な説明: *

Chet Haase と Romain Guy による Filthy Rich Clients からの引用

It is important to note that repaint requests get “coalesced,” or combined. 
So, for example, if you request a repaint and there is already one on the 
queue that has not yet been serviced, then the second request is ignored 
because your request for a repaint will already be fulfilled by the earlier 
request. This behavior is particularly helpful in situations where many
repaint requests are being generated, perhaps by very different situations 
and components, and Swing should avoid processing redundant requests and 
wasting effort.

これを実際に試してみて、わからないことを質問してください。

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class PointsExample
{   
    private CustomPanel contentPane;
    private Timer timer;
    private int x = 1;
    private int y = 1;
    private ActionListener timerAction = new ActionListener()
    {   
        public void actionPerformed(ActionEvent ae)
        {
            contentPane.set(x, y);
            x++;
            y++;
            if (x == 450)
                timer.stop();
        }
    };
    /*
     * This is just JFrame, that we be 
     * using as the Base for our Application.
     * Though here we are calling our
     * JPanel (CustomPanel), whose
     * paintComponent(...) method, we had
     * override.
     */
    private void createAndDisplayGUI()
    {
        JFrame frame = new JFrame("Locate Mouse Position");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        contentPane = new CustomPanel();
        frame.setContentPane(contentPane);  
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
        timer = new Timer(100, timerAction);
        timer.start();
    }

    public static void main(String\u005B\u005D args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new PointsExample().createAndDisplayGUI();
            }
        });
    }
}

class CustomPanel extends JComponent
{
    private int x;
    private int y;

    public void set(int a, int b)
    {
        x = a;
        y = b;
        repaint();
    }   

    @Override
    public Dimension getPreferredSize()
    {
        return (new Dimension(500, 500));
    }

    @Override
    public void paintComponent(Graphics g)
    { 
        g.clearRect(0, 0, getWidth(), getHeight());
        Graphics2D g2 =(Graphics2D) g;
        g2.fillOval(x, y, 4, 4);        
    }
}

これは、forループ内で反復しながらポイントを確認できるコードです。ただし、このアプローチは、それに関連する多くの短所があるため、非常に推奨されていません。repaint()call paintImmediately(int ...)またはpaintImmediately(Rectangle rect)を呼び出す代わりに、これを試してみてください

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class PointsExample
{   
    private CustomPanel contentPane;
    private Timer timer;
    private int x = 1;
    private int y = 1;

    /*
     * This is just JFrame, that we be 
     * using as the Base for our Application.
     * Though here we are calling our
     * JPanel (CustomPanel), whose
     * paintComponent(...) method, we had
     * override.
     */
    private void createAndDisplayGUI()
    {
        JFrame frame = new JFrame("Locate Mouse Position");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        contentPane = new CustomPanel();
        frame.setContentPane(contentPane);  
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

        for (int i = 0; i < 500; i++)
        {
            contentPane.set(x, y);
            x++;
            y++;
            if (x == 450)
                break;
        }
    }

    public static void main(String\u005B\u005D args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new PointsExample().createAndDisplayGUI();
            }
        });
    }
}

class CustomPanel extends JComponent
{
    private int x;
    private int y;

    public void set(int a, int b)
    {
        x = a;
        y = b;
        paintImmediately(0, 0, getWidth(), getHeight());

    }   

    @Override
    public Dimension getPreferredSize()
    {
        return (new Dimension(500, 500));
    }

    @Override
    public void paintComponent(Graphics g)
    { 
        super.paintComponent(g);
        g.fillOval(x, y, 4, 4);         
    }
}
于 2012-04-27T14:52:32.010 に答える
2

1: の最初の行はpaintComponent()あなたのものでなければなりませんsuper.paintComponent()

2: なぜ super.repaint() を呼び出しているのですか。単純にしますrepaint()

あなたのドローはこうあるべきです。

public class drow extends JPanel {
 ...........
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 =(Graphics2D) g;

}
public void set_list(LinkedList <point> p){
Points =p;     
repaint();
}

これで試してください。これが単なる構造であることを願っています。あなたの paintComponent() は何も描画していません。

編集

public void set_list(LinkedList <point> p){
Points =p;     
System.out.println("set_ist");// 1:First this line will be displayed then..
repaint();//2: Then this is called, which in turn calls your `paintComponent()`
}

今あなたpaintComponent()が呼ばれたとき、それは持っています

system.out.println("paintComponent");
//3: so now this will be displayed.

ここで問題はどこにありますか?

エディット - スイングタイマー

コードは問題ありませんでしたが、関数の処理は GUI の更新よりもはるかに高速であるため、目の前の変更を確認できませんでした。関数呼び出しの間に thread.sleep() を呼び出して呼び出しを遅くする方法は、良いアプローチではありませんでした。スイング中のタイミングについては、スイングタイマーを使用してください。スイングタイマーのコードを変更しました。

スイングタイマーの使用:

public class exampe extends JPanel implements ActionListener {

    int x;
    int y;
    int temp = 0;

    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.fillOval(x - 2, y - 2, 4, 4);
    }

    public void set(int X, int Y) {

        x = X;
        y = Y;
    }

    public static void main(String args[]) {

        JFrame frame = new JFrame("TEST");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        exampe ex = new exampe();
        JScrollPane scroll = new JScrollPane(ex);
        frame.getContentPane().add(scroll);
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        Timer PointTimer = new Timer(1000, ex);
        PointTimer.setInitialDelay(1000);
        PointTimer.start();
        System.out.println("started");
    }

    @Override
    public void actionPerformed(ActionEvent e) {

       // set(rand.nextInt(350), rand.nextInt(350));
          set(temp+10,temp+10);
          temp=temp+2;
          repaint();
    }
}
于 2012-04-26T17:24:44.433 に答える