Java JComponent';验证()、重新验证()或绘制()正在调用s绘制(图形g)方法?

Java JComponent';验证()、重新验证()或绘制()正在调用s绘制(图形g)方法?,java,swing,java-2d,Java,Swing,Java 2d,我已经有一段时间(2年多)没有开发JavaSwing应用程序了,所以请原谅我犯了一些愚蠢的错误 我想上传一些艺术品,这将显示为全屏图像 我遇到的问题是,我已经扩展用于表示图像对象的JComponent,没有调用它的paint()方法,也没有在现有的JPanel上绘制自己。 下面是通过扩展JComponent的“art”类上载图像和实例化的相关片段和事件 类JFrameMainArt的actionPerformed()方法(仅适用于相关部分),当打开操作结束时,图像对象应绘制在fullscreen

我已经有一段时间(2年多)没有开发JavaSwing应用程序了,所以请原谅我犯了一些愚蠢的错误

我想上传一些艺术品,这将显示为全屏图像

我遇到的问题是,我已经扩展用于表示图像对象的JComponent,没有调用它的paint()方法,也没有在现有的JPanel上绘制自己。

下面是通过扩展JComponent的“art”类上载图像和实例化的相关片段和事件 类JFrameMainArt的actionPerformed()方法(仅适用于相关部分),当打开操作结束时,图像对象应绘制在fullscreenJPanel上

@Override
    public void actionPerformed(ActionEvent arg0) {

        if (arg0.getActionCommand().equalsIgnoreCase("Fullscreen Mode")) {
            isScreenFullscreen = true;
            // full screen mode settings
            fullscreenFrame.invalidate();
            fullscreenFrame = null;
            // create new fullscreen frame
            fullscreenFrame = new JFrame();
            fullscreenFrame
                    .setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            fullscreenFrame.setUndecorated(true);
            fullscreenFrame.setResizable(false);
            // add label to Panel
            fullscreenPanel.add(new JLabel("ALT + F4 to exit .",
                    SwingConstants.CENTER), BorderLayout.CENTER);
            fullscreenFrame.invalidate();
            GraphicsEnvironment.getLocalGraphicsEnvironment()
                    .getDefaultScreenDevice()
                    .setFullScreenWindow(fullscreenFrame);
        } else if (arg0.getActionCommand().equalsIgnoreCase("Upload")) {
            System.out.println("Upload Pictures");
            fileChooser = new JFileChooser();
            fileChooser
                    .setDialogTitle("Choose Your Image File (PNG or JPEG only)");
            // below codes for select the file
            int returnval = fileChooser.showOpenDialog(null);
            File file = fileChooser.getSelectedFile();
            System.out.println("Upload Pictures, selected file path: "
                    + file.getAbsolutePath());

            // if OPEN
            if (returnval == JFileChooser.APPROVE_OPTION) {

                String name = file.getName();
                if (name != null) {
                    int i = name.indexOf('.');
                    // get the extension such as jpeg, or png
                    String extension = name.substring(i + 1);
                    System.out.println("extension: " + extension);
                    if (extension.equalsIgnoreCase("jpeg")
                            || extension.equalsIgnoreCase("jpg")
                            || extension.equalsIgnoreCase("png")) {

                        Art newArt = new Art(file, fullscreenPanel.getSize());
                        //test dimension 
                        System.out.println("Dimension of image "+name+"- Dimensions "+newArt.scaleImageToJPanelDimensions(newArt.getImageFromFile()));


                        //add Art Jcomponent to existing JPanel
                        fullscreenPanel.add(newArt);
                        //revalidate & paint
                        fullscreenPanel.revalidate();
                        fullscreenPanel.repaint();
                        //pack & revalidate the Jframe
                        fullscreenFrame.revalidate();


                    } else {
                        System.out
                                .println("Error file/image type is not supported: "
                                        + extension);
                    }

                }// end name not null
                else {
                    System.out.println("Error file name: " + name);
                }

            } else if (returnval == JFileChooser.ERROR_OPTION) {
                System.out.println("Error selecting file");
            } else {
                System.out.println("returnval: " + returnval);
            }

        }// end else if upload
        else if (arg0.getActionCommand().equalsIgnoreCase("Choose Effect")) {

        } else {

        }

    }//end method actionPerformed()
Art.java扩展了JComponent,并负责加载图像、缩放图像、绘制图像对象

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.beans.Transient;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JComponent;

public class Art extends JComponent {

    private File file = null;
    private BufferedImage image = null;
    private Dimension dimensionToScale = null;

    public Art(File file, Dimension dimensionToScale) {
        super();
        this.file = file;
        this.dimensionToScale = dimensionToScale;
        this.setVisible(true);

    }

    @Override
    @Transient
    public Dimension getPreferredSize() {
        // TODO Auto-generated method stub
        return this.dimensionToScale;
    }

    public Art(File file) {
        super();
        this.file = file;
        this.setVisible(true);
    }

    public BufferedImage getImageFromFile() {
        BufferedImage  image = null;
        if (this.file != null) {
            try {
                image = ImageIO.read(file);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return image;
    }

    public Dimension scaleImageToJPanelDimensions(BufferedImage image) {
        Dimension dimension = null;
        // scaling factors

        int imageWidth = image.getWidth();
        int imageHeight = image.getHeight();


        // scale based on largest side
        int largestImageSide = Math.min(imageWidth, imageHeight);

        double scaledHeight =  this.dimensionToScale.getHeight()
                / largestImageSide;
        double scaledWidth =  this.dimensionToScale.getWidth()
                / largestImageSide;
        // compute new image dimensions
        imageWidth = (int) (imageWidth * scaledWidth);
        imageHeight = (int) (imageHeight * scaledHeight);

        dimension = new Dimension(imageWidth, imageHeight);

        return dimension;

    }

    @Override
    public void paintComponent(Graphics g) {

        System.out.println("paintComponent(Graphics g) ");

        super.paintComponent (g);

        // repaint background
        g.setColor(getBackground());
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(getForeground());


        image = getImageFromFile();
        if (image != null) {

            // compute dimensions of image to draw
            Dimension imageDimension = scaleImageToJPanelDimensions(image);
    /*public abstract boolean drawImage(Image img,
            int x,
            int y,
            int width,
            int height,
            ImageObserver observer)*/

            g.drawImage(image, 0,0, (int) imageDimension.getWidth() ,(int)imageDimension.getHeight(),this);

        } else {
            System.out.println("paintComponent(Graphics g)  image:"+image);
        }

    }

}/end Art class
任何帮助都将不胜感激

谢谢

实际工作方法,现在已绘制图像,问题已解决

public void loadArtToScreen(Art art)
    {


        //add Art JComponent to existing JPanel
        JPanelGroupLayout.setHorizontalGroup(JPanelGroupLayout.createParallelGroup(
                Alignment.LEADING).addGroup(
                        JPanelGroupLayout.createSequentialGroup().addGap(0)
                        .addComponent(art )
                        .addContainerGap((int)mainJFrameSize.getWidth(), Short.MAX_VALUE)));

        JPanelGroupLayout.setVerticalGroup(JPanelGroupLayout.createParallelGroup(
                Alignment.LEADING).addGroup(
                        JPanelGroupLayout.createSequentialGroup().addGap(0)
                        .addComponent(art )
                        .addContainerGap((int)mainJFrameSize.getHeight(), Short.MAX_VALUE)));

        //revalidate & paint
        fullscreenPanel.revalidate();
        fullscreenPanel.repaint();
        //pack & revalidate the Jframe
        mainJFrame.revalidate();

    }//end loadArtToScreen(Art art)
  • 您从未加载
    图像
    ,因此您的
    绘制
    方法将抛出
    NullPointerException
  • Graphics#drawImage(Image,int,int,ImageObserver)
    指的是图像应该绘制的位置,而不是它的大小(奇怪的是,您的缩放算法是return
    0x0
    ,但我没有花太多时间研究它)
  • 在此上下文中,您应该将
    this
    传递到
    Graphics#drawImage
  • 建议在
    paintComponent
    方法而不是
    paint
    方法的上下文中进行自定义绘制。有关更多详细信息,请参阅
  • 注意-我还尝试将窗格添加到全屏窗口中,没有出现问题。在我纠正了
    NullPointerException
    之后,我甚至在帧变为可见和添加窗格之间引入了一个小延迟,并使其工作


    在测试时尝试删除全屏要求…

    调用
    fullscreenFrame.pack()在全屏窗口上没有意义…为了更快地获得更好的帮助,请发布。我更新了上述代码,修复了您提出的错误1)我现在正在加载图像,2)我正在绘制图像从顶部开始,左0,0图像尺寸不再为零3)JComponent引用在paintComponent()中传递4)我正在使用paintComponent(),没有错误或异常,但是,图像仍然没有绘制,paintComponent()从未调用。因此,我可以让您的艺术类。paintComponent不会被调用的唯一原因是组件t不可显示(已添加到屏幕上显示的容器中)或组件没有合适的大小。这一切都不可能确定。你的片段。用一个可运行的例子,我们只能猜测@MadProgrammer,谢谢你的努力,我实际上已经发布了整个艺术课程,请参见上面。在我的程序中,我将艺术(JComponent)添加到一个具有GroupLayout的JPanel中,而JPanel(将与JFrame相同)本身被添加到我的主JFrame(也是GroupLayout)中,现在将发布整个主JFrame。@Aryanaim是的,我使用了你的艺术类,这就是为什么我可以找到错误的原因。我会避免使用GroupLayout,它不是特别动态的。尝试使用BorderLayout之类的东西作为测试,我实际上将图像加载封装在一个方法中,并发现我必须通过指定水平和垂直组件将我的艺术类(JComponent)添加到主JPanel is groupLayout中。这幅画现在已经画出来了,但是它很小,实际上画出了图片的1/4,尽管尺寸是正确的。我会接受你的回答,因为你指出了重要的错误。我将在上面发布我的工作方法,基于loadArtToScreen(艺术)方法为什么只绘制图像的1/4???谢谢