2

私はいくつかの単純なアプリケーションを使って Swing に慣れ、問題に直面しています。

画像をズームイン/ズームアウトするボタンとともに、(パネル内の) 画像を含むフレームを作成しようとしています。

画像を追加したフレームを正常に動作させることができました (ただし、フレーム サイズの問題はありますが、それは別の話です)。ただし、同じコンポーネント クラスを呼び出してパネルに追加しても、何も表示されません。あなたの一人が状況を明らかにするのを手伝ってくれることを願っています.

コード:

画像フレーム - 示されているように機能しています

class ImageFrame extends JFrame{

public ImageFrame(){
    setTitle("Java Image Machine");

    init();
    pack();
}   

public final void init(){
    //ZoomPanel zoomPanel = new ZoomPanel();
    //ImagePanel imagePanel = new ImagePanel();
    ImageComponent component = new ImageComponent();

    //this.add(zoomPanel, BorderLayout.CENTER);
    this.add(component);
    //this.add(imagePanel, BorderLayout.SOUTH);
}
}

ただし、ImagePanel を使用するか、ImageComponent の直接呼び出しと同時に ZoomPanel を追加しても、次のことはできません。

class ImagePanel extends JPanel{    
public ImagePanel(){
    //setBorder(BorderFactory.createLineBorder(Color.black));
    ImageComponent component = new ImageComponent();
    add(component);
}   
}

コンポーネント クラス:

class ImageComponent extends JComponent{
public ImageComponent(){

    try{
        image = ImageIO.read(new File("test1.bmp"));
    }
    catch ( IOException e ){
        e.printStackTrace();
    }

    System.out.println("W: " + image.getWidth(this) + " H: " + image.getHeight(this));
}

public void paintComponent( Graphics g ){
    super.paintComponent(g);
    if (image == null)
        return;

    width = image.getWidth(this);
    height = image.getHeight(this);

    //System.out.println("Image should be painted");
    g.drawImage(image, 0, 0, null);
}

private Image image;
public int width;
public int height;

}

4

2 に答える 2

4

それは私にとってはうまくいきます(私はちょうどImageComponentクラスをテストしました):

ここに画像の説明を入力

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class Test {

    /**
     * Default constructor Test.class
     */
    public Test() {
        initComponents();
    }

    public static void main(String[] args) {

        /**
         * Create GUI and components on Event-Dispatch-Thread
         */
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Test test = new Test();
            }
        });
    }

    /**
     * Initialize GUI and components (including ActionListeners etc)
     */
    private void initComponents() {
        JFrame jFrame = new JFrame();
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //add ImageComponent to JFrame instance
        jFrame.add(new ImageComponent());

        //pack frame (size JFrame to match preferred sizes of added components and set visible
        jFrame.pack();
        jFrame.setVisible(true);
    }
}

class ImageComponent extends JComponent {

    private Image image;
    public int width;
    public int height;

    public ImageComponent() {
        try {
            image = ImageUtils.scaleImage(300, 300, ImageIO.read(new URL("http://harmful.cat-v.org/software/_java/java-evil-edition.png")));
            //image =  ImageIO.read(new URL("http://harmful.cat-v.org/software/_java/java-evil-edition.png"));//uses images scale
        } catch (Exception e) {
            e.printStackTrace();
        }

        //so we can set the JPanel preferred size to the image width and height
        ImageIcon ii = new ImageIcon(image);
        width = ii.getIconWidth();
        height = ii.getIconHeight();
    }

    //so our panel is the same size as image
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(width, height);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        if (image == null) {
            return;
        }

        width = image.getWidth(this);
        height = image.getHeight(this);

        g.drawImage(image, 0, 0, null);
    }
}
//class used for scaling images
class ImageUtils {

    static Image scaleImage(int width, int height, BufferedImage filename) {
        BufferedImage bi;
        try {
            bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = (Graphics2D) bi.createGraphics();
            g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
            g2d.drawImage(filename, 0, 0, width, height, null);
        } catch (Exception e) {
            return null;
        }
        return bi;
    }
}

問題はファイルへのパスである可能性があります。または、JPanel幅と高さが写真と同じではないため、オーバーライドgetPrefferedSize(...)JPanelて正しいサイズを返します。Image

于 2012-10-25T17:34:39.337 に答える
1

repaint()適切なコンポーネントを追加した後、呼び出しを追加しようとしましたか?

すなわち

class ImagePanel extends JPanel{    
    public ImagePanel(){
        //setBorder(BorderFactory.createLineBorder(Color.black));
        ImageComponent component = new ImageComponent();
        add(component);
        repaint();
    }   
}

また、ImagePanel (ImageComponent を含む) を ImageFrame に追加していること、および .setVisible(True) を呼び出していることも再確認してください。

于 2012-10-25T17:22:02.970 に答える