Java-Image图形用户界面

Java-Image图形用户界面,java,swing,Java,Swing,我正在编写一个代码,读取图像URL并在窗口上显示图像,该代码可以将图像旋转180度,可以使图像模糊,并可以将颜色更改为灰色,我正在尝试为每个功能添加一个按钮,我添加了按钮,它们出现了,但由于某种原因,图像根本没有显示出来 有人能告诉我为什么没有显示图像吗 代码如下: import java.awt.*; import java.awt.event.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImag

我正在编写一个代码,读取图像URL并在窗口上显示图像,该代码可以将图像旋转180度,可以使图像模糊,并可以将颜色更改为灰色,我正在尝试为每个功能添加一个按钮,我添加了按钮,它们出现了,但由于某种原因,图像根本没有显示出来

有人能告诉我为什么没有显示图像吗

代码如下:

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
public class photoApp extends JComponent {
protected BufferedImage img;
protected BufferedImage rotated;
protected JFrame frame;
protected JPanel panel;
protected JButton rotateButton,greyButton,blurButton;
InputMap im = getInputMap(WHEN_FOCUSED);
ActionMap am = getActionMap();
public photoApp() throws MalformedURLException, IOException {
    frame = new JFrame("Photo App");
    img=ImageIO.read(new 
    URL("https://i.pinimg.com/originals/3e/7d/b3/3e7db36e4469b80c257eb03468cd5205.jpg"));
    rotated = rotateImageByDegrees(img, 180);
    panel = new JPanel();
    panel.setLayout(new FlowLayout(FlowLayout.CENTER));
    rotateButton = new JButton("Rotate");
    rotateButton.addActionListener(new ButtonHandler());
    greyButton = new JButton("Grascale");
    greyButton.addActionListener(new ButtonHandler());
    blurButton = new JButton("Blur");
    blurButton.addActionListener(new ButtonHandler());
    panel.add(rotateButton);
    panel.add(greyButton);
    panel.add(blurButton);
    frame.add(panel,BorderLayout.NORTH);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
    }
    public BufferedImage toGrayScale(BufferedImage img) {
    for (int x = 0; x < img.getWidth(); x++) {
        for (int y = 0; y < img.getHeight(); y++) {
            Color color = new Color(img.getRGB(x, y));
            int red = color.getRed();
            int green = color.getGreen();
            int blue = color.getBlue();
            red = green = blue = (int) (red * 0.299 + green * 0.587 + blue * 0.114);
            color = new Color(red, green, blue);
            int rgb = color.getRGB();
            img.setRGB(x, y, rgb);
        }
    }
    return img;
    }
    public BufferedImage toBlur(BufferedImage img){
    Kernel kernel = new Kernel(3, 3,
            new float[] {
                    1f/9f, 1f/9f, 1f/9f,
                    1f/9f, 1f/9f, 1f/9f,
                    1f/9f, 1f/9f, 1f/9f});
    BufferedImageOp op = new ConvolveOp(kernel);
    return  img = op.filter(img, null);
    }
    public BufferedImage rotateImageByDegrees(BufferedImage img, double angle) {
    int w = img.getWidth();
    int h = img.getHeight();

    BufferedImage rotated = new BufferedImage(w, h, img.getType());
    Graphics2D graphic = rotated.createGraphics();
    graphic.rotate(Math.toRadians(angle), w/2, h/2);
    graphic.drawImage(img, null, 0, 0);
    graphic.dispose();
    return rotated;
    }
    public Dimension getPreferredSize() {
    //Using image size as preferred size
    return new Dimension(img.getWidth(), img.getHeight());
    }
    public Dimension getMinimumSize() {
    //Using image size as minimum size
    return new Dimension(img.getWidth(), img.getHeight());
    }
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    //Compute scaling for both axis according to current component size
    //then use the lower value
    double scaleX=getWidth()*1.0/img.getWidth();
    double scaleY=getHeight()*1.0/img.getHeight();
    double scale=Math.min(scaleX, scaleY);

    //Center the image on the axis with greater scale
    double offsetX=(getWidth()-scale*img.getWidth())/2.0;
    double offsetY=(getHeight()-scale*img.getHeight())/2.0;

    Graphics2D g2=(Graphics2D) g.create();

    //This gives a better quality in upscaling, but also slow down the repainting, remove it if the 
    resizing not responsive enough
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
    RenderingHints.VALUE_INTERPOLATION_BICUBIC);

    //We must consider the current possible transform before applying our scaling
    //Current transform
    AffineTransform at=g2.getTransform();
    //Translate to center
    at.concatenate(AffineTransform.getTranslateInstance(offsetX, offsetY));
    //Scale image
    at.concatenate(AffineTransform.getScaleInstance(scale, scale));

    g2.setTransform(at);
    //Paint the transformed image
    g2.drawImage(img, 0, 0, null);

    g2.dispose();
}
private class ButtonHandler implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == rotateButton) {
            img = toBlur(img);
            repaint();
        } else if (e.getSource() == greyButton) {
            img = toGrayScale(img);
            repaint();
        } else if (e.getSource() == rotateButton)
        {
            img = rotateImageByDegrees(img,180);
            repaint();
        }
    }
}
public static void main(String[] args) throws MalformedURLException, IOException {
    new photoApp();
}
}
import java.awt.*;
导入java.awt.event.*;
导入java.awt.geom.AffineTransform;
导入java.awt.image.buffereImage;
导入java.awt.image.BufferedImageOp;
导入java.awt.image.ConvolveOp;
导入java.awt.image.Kernel;
导入java.io.IOException;
导入java.net.MalformedURLException;
导入java.net.URL;
导入javax.imageio.imageio;
导入javax.swing.*;
公共类photoApp扩展了JComponent{
受保护的缓冲图像img;
受保护的缓冲区图像旋转;
保护JFrame;
受保护的JPanel面板;
受保护的JButton旋转按钮、灰色按钮、模糊按钮;
InputMap im=getInputMap(聚焦时);
ActionMap am=getActionMap();
public photoApp()引发错误的DurLexception,IOException{
frame=新JFrame(“照片应用”);
img=图像IO.read(新
网址(“https://i.pinimg.com/originals/3e/7d/b3/3e7db36e4469b80c257eb03468cd5205.jpg"));
旋转=以度旋转图像(img,180);
panel=新的JPanel();
panel.setLayout(新的FlowLayout(FlowLayout.CENTER));
rotateButton=新的JButton(“旋转”);
addActionListener(新的ButtonHandler());
灰色按钮=新的JButton(“Grascale”);
addActionListener(newbuttonHandler());
blurButton=新的JButton(“模糊”);
addActionListener(newButtonHandler());
面板。添加(旋转按钮);
面板。添加(灰色按钮);
面板。添加(模糊按钮);
框架。添加(面板,边框布局。北);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
公共BuffereImage toGrayScale(BuffereImage img){
对于(int x=0;x
请提供一个示例,如果您从未将面板添加到JPanel,为什么您认为它应该显示图像?你可以尝试
panel.add(这个)@matt它不是minimal@matt我试过了,但图像正在放大in@MohammedHamdoon那么现在这是一个不同的问题?