繁体   English   中英

Java repaint()无法正常工作

[英]Java repaint() not working

我正在制作一个简单的程序来绘制图形和其中的一些点。 这些点应在更改g.fillOval坐标的同时使用方法进行,但实际上它仅绘制最后一个点。

这是代码:

import javax.swing.*;
import java.awt.*;
public class PointGraphWriter extends JPanel
{
   JFrame korniza = new JFrame();
   private int x;
   private int y;
   private int length;
   private String OX;
   private String OY;
   private String emri;
   private int y_height;
   private int x_num;

   public PointGraphWriter()
   {
      int width= 500;
      korniza.setSize(width,width);
      korniza.setVisible(true);
      korniza.setTitle(emri);
      korniza.getContentPane().add(this);

   }

   public void paintComponent(Graphics g)
   {
      g.drawLine(x,y,x+length,y);
      g.drawLine(x,y,x,y-length);
      g.drawString(OX,x+length, y+15);
      g.drawString(OY,x-15,y-length);
      g.drawString("0", x -15,y);
      g.drawString("0", x,y+15);
      g.fillOval(x_num,y-y_height-2, 4 ,4);
   }

   public void setTitle(String name)
   {
      emri= name;
      this.repaint();
   }

   public void setAxes(int x_pos, int y_pos, int axis_length, String x_label, String y_label)
   {
      x= x_pos;
      y=y_pos;
      length= axis_length;
      OX = x_label;
      OY = y_label;   
   }

   public void setPoint1(int height)
   {
      y_height=height;
      x_num = x-2;
      this.repaint();
   }

   public void setPoint2(int height)
   {
      y_height=height;
      x_num = x + length/5-2;
      this.repaint();
   }   
}   

这是主要方法:

public class TestPlot
{
   public static void main(String[] a)
   { 
      PointGraphWriter e = new PointGraphWriter();
      e.setTitle("Graph of y = x*x");
      e.setAxes(50, 110, 90, "5", "30");
      int scale_factor = 3;
      e.setPoint1(0 * scale_factor); 
      e.setPoint2(1 * scale_factor);
   }
}

请看一下这个例子。 与此类似,您可能必须将其合并到示例中才能使其正常工作。 只需使用一个Collection来存储您先前绘制的内容,然后当新的东西出现时,只需将该东西添加到列表中,然后再次重新绘制整个Collection 如下所示 :

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;

public class RectangleExample {

    private DrawingBoard customPanel;
    private JButton button;

    private Random random;

    private java.util.List<Rectangle2D.Double> rectangles;

    private ActionListener buttonActions = 
                        new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            Rectangle2D.Double rectangle = new Rectangle2D.Double(
                        (double) random.nextInt(100), (double) random.nextInt(100),
                        (double) random.nextInt(100), (double) random.nextInt(100));
            rectangles.add(rectangle);
            customPanel.setValues(rectangles);
        }
    };

    public RectangleExample() {
        rectangles = new ArrayList<Rectangle2D.Double>();
        random = new Random();
    }   

    private void displayGUI() {
        JFrame frame = new JFrame("Rectangle Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout(5, 5));

        customPanel = new DrawingBoard();
        contentPane.add(customPanel, BorderLayout.CENTER);

        button = new JButton("Create Rectangle");
        button.addActionListener(buttonActions);
        contentPane.add(button, BorderLayout.PAGE_END);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                new RectangleExample().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

class DrawingBoard extends JPanel {

    private java.util.List<Rectangle2D.Double> rectangles = 
                                new ArrayList<Rectangle2D.Double>();

    public DrawingBoard() {
        setOpaque(true);
        setBackground(Color.WHITE);
    }

    public void setValues(java.util.List<Rectangle2D.Double> rectangles) {
        this.rectangles = rectangles;
        repaint();
    }

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

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Rectangle2D.Double rectangle : rectangles) {
            g.drawRect((int)rectangle.getX(), (int)rectangle.getY(),
                    (int)rectangle.getWidth(), (int)rectangle.getHeight());
        }
        System.out.println("WORKING");
    }
}

有关两种常见绘画方法的示例,请参见自定义绘画方法

  1. 保留要绘制的对象的列表
  2. 绘制到BufferedImage上

您选择的方法将取决于您的确切要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM