Java 绘制、重新绘制和绘制组件

Java 绘制、重新绘制和绘制组件,java,swing,paint,Java,Swing,Paint,我正在关注Oracle网站上关于重新缩放使用的教程。我试图在没有小程序的情况下完成教程,并将所有内容转换为swing。代码如下 import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.WindowAdapt

我正在关注Oracle网站上关于重新缩放使用的教程。我试图在没有小程序的情况下完成教程,并将所有内容转换为swing。代码如下

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.RescaleOp;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/*
 * How to load an Image from an external file.
 */
public class ARGB extends JPanel {

    BufferedImage img;
    float[] scales = { 1f, 1f, 1f, 0.5f };
    float[] offsets = new float[4];
    RescaleOp rop;

    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.white);
        g2d.fillRect(0, 0, getWidth(), getHeight());
        g2d.setColor(Color.black);
        g2d.setFont(new Font("Dialog", Font.BOLD, 24));
        g2d.drawString("Java 2D is great!", 10, 80);
        g2d.drawImage(img, rop, 0, 0);
        System.out.println("hi");

    }

    public ARGB() {
        try {
            img = ImageIO.read(new File("src/strawberry.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
            // TODO: handle exception
        }
    }

    public Dimension getPreferredSize() {
        if (img == null) {
            return new Dimension(100, 100);
        } else {
            return new Dimension(img.getWidth(), img.getHeight());
        }
    }

    public void setOpacity(float opacity) {
        scales[3] = opacity;
        rop = new RescaleOp(scales, offsets, null);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        final ARGB argb = new ARGB();
        JFrame frame = new JFrame("See Through Image");
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.add("Center", new LoadImage());
        JSlider opacitySlider = new JSlider(0, 100);
        frame.add("South", opacitySlider);
        opacitySlider.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                JSlider slider = (JSlider) e.getSource();
                argb.setOpacity(slider.getValue() / 100f);
                argb.repaint();
            }
        });
        Dimension size = argb.getPreferredSize();
        Dimension sliderSize = opacitySlider.getPreferredSize();
        frame.setSize(size.width, size.height + sliderSize.height);
        frame.pack();
        frame.setVisible(true);
    }

}
当我运行它时,我在第39行没有看到我的调试语句。我真的不明白为什么。
谢谢

您尚未将ARGB类的JPanel对象ie.e实例添加到框架中。您已添加LoadImage对象。它在哪里??debug语句在ARGB vlass中。您必须添加ARGB对象。那么只有它的绘制方法才会被调用

您的确切问题是什么?请再解释一下。第39行是什么?这篇文章的标题是什么?别忘了给super.paintComponent打电话