paintComponent无法正常工作(Java)

Lin*_*xgl 3 java swing jframe repaint paintcomponent

我一直试图覆盖并使用paint组件方法而不是paint方法,因为我已经看到它在这里的多个问题中被提出.

我已经看了很多问题,但我似乎仍然无法让这个工作.我发布了用于渲染屏幕的原始代码.我认为扩展JFrame不是正确的方法,而是我需要扩展JPanel,并从那里使用paint组件.我有另一个对象,我实际上扩展了JPanel,并添加了JFrame(用于渲染).

这是我用来渲染的对象,通过这种方式可以完美地覆盖paint方法.

package render;


import java.util.Arrays;

import javax.swing.*;

import java.awt.*; //Graphics, Graphics2D, Image

import sprites.Picture;


public class Window extends JFrame{
    private static final long serialVersionUID = 1L;

    public static Picture[] image_list =  new Picture[0]; // All the images I want to render
    private static String win_title = "Window"; // The name of the window
    private static CustomComponents cc = new CustomComponents();


    public Window(){
        setTitle(win_title); // set my title
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // close when you hit x button
        setUndecorated(true); // window has nothing on it

    }


    // paints all the images in image list according to their priority

    public void display(){
        add(cc);
        CustomComponents.updateImageList(image_list);
        pack();

        setMinimumSize(getSize());
        setLocationRelativeTo(null); // puts the screen in the middle
        setResizable(false); // can't resize the window
        setVisible(true); // to see the window


    }



    public double[] getWinSize(){
        double[] size = {this.getSize().getWidth(),this.getSize().getWidth()};

        return size;
    }

    public static void endAll(){
        for (Picture i:image_list){
            i = null;
        }
        image_list = new Picture[0];
        CustomComponents.updateImageList(image_list);
    }

    // close the window (seen in the game object)
    public static void close(){
        System.exit(0);
    }

    // called when adding a new sprite to the image_list array
    public static void addPicture(Picture element){
        Picture[] result = Arrays.copyOf(image_list, image_list.length +1); // does the same thing as the addObject method in objects
        result[image_list.length] = element;
        image_list = result;
        Arrays.sort(image_list);
        CustomComponents.updateImageList(image_list);

    }

    // updates the screen... Just repaints everything
    public void update() {
        cc.repaint();

    }

}


class CustomComponents extends JComponent {

    private static final long serialVersionUID = 1L;

    private static Picture[] image_list;

    public static void updateImageList(Picture[] image_list){
        CustomComponents.image_list = image_list;
    }

    @Override
    public Dimension getMinimumSize() {
        return new Dimension(640,360);
    }

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

    @Override
    public Dimension getMaximumSize() {
        return new Dimension(640,360);
    }

    @Override
    public void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        Graphics2D g2d = (Graphics2D) graphics;
        for (Picture i:image_list){
            if (i.getVisibility()){
            g2d.drawImage(i.getPic(), i.getXY()[0], i.getXY()[1], this);
            }
        }
        Toolkit.getDefaultToolkit().sync(); // this is for linux machines
        graphics.dispose(); // just good programming practice to collect the garbage
    }
}
Run Code Online (Sandbox Code Playgroud)

我会发布实际上在窗口中添加的对象,但现在它太复杂了,只发生了一些事情.在构造函数中,我在上面添加了JFrame窗口,然后我使用一个计时器来调用JFrame对象上的update方法.

如果你们真的需要代码我可以发布它但希望这就足够了.

mKo*_*bel 10

  • 不要画画

    1. 通过paintComponent()直接使用JFrame,
    2. 不直接画的好主意JFrame,JFrame不适合这份工作
    3. 必须使用paint()而不是paintComponent()JFrame,
  • @Override您认为应该覆盖父方法的任何方法之前添加,这里是paintComponent(...)方法.这样,编译器会警告你,如果你实际上没有超越你的想法.

  • 放到JComponent / JPanelJFrame

  • 覆盖getPreferredSizeJComponent / JPanel(你的硬编码 // window size handle),否则JComponent / JPanel返回零维,简单的什么也不会在creen可见

  • +1表示所有建议.虽然我建议在2D图形教程之前阅读Swing教程:[自定义绘画](http://docs.oracle.com/javase/tutorial/uiswing/painting/index.html)教程.这是关于绘画的最基本的教程. (2认同)