0

基本的に、img_wとimg_b1という2つの異なるBufferedImageがあります... Jframe / labelをそれらの1つに設定すると、新しいImagebuffered値に変更されたりrepants()されたりすることはありません...

前もって感謝します..

BufferedImage img_w = new BufferedImage(old_width_i, old_height_i, BufferedImage.TYPE_INT_RGB);
BufferedImage img_b1 = new BufferedImage(old_width_i, old_height_i, BufferedImage.TYPE_INT_RGB);

// add data into the img_w and img_b1

JFrame frame=new JFrame();
JLabel label = new JLabel(new ImageIcon(img_w));
frame.getContentPane().add(label, BorderLayout.WEST);
frame.pack();
frame.setVisible(true); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

//I am trying to sleep only cause I want to make out if the image is changing or not or basically , to have a rotating illusion...

System.out.println("Hello");
frame.getContentPane().add(new JLabel(new ImageIcon(img_w)), BorderLayout.WEST);
frame.repaint();


label = new JLabel(new ImageIcon(img_b1));
frame.getContentPane().add(label,BorderLayout.WEST); //display the image (works)
label.repaint(); //update the display??
frame.repaint();
frame.getContentPane().repaint();
4

2 に答える 2

3

これ...

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

UI が終了するまでペイント リクエストを処理しないようにします。EDT をブロックしないでください。

以下の例 (単純) は、画像間を手動で移動する簡単な方法を示しています。

public class FlipPictures {

    public static void main(String[] args) {
        new FlipPictures();
    }

    public FlipPictures() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new PicturePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

            }
        });
    }

    public class PicturePane extends JPanel {

        private JLabel picture;
        private File[] pictures;
        private int currentPicture = -1;

        public PicturePane() {

            pictures = new File("/point/me/to/a/directory/of/images").listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    String name = pathname.getName().toLowerCase();
                    return name.endsWith(".png") 
                            || name.endsWith(".gif") 
                            || name.endsWith(".jpg")
                            || name.endsWith(".jpeg")
                            || name.endsWith(".bmp");
                }
            });

            setLayout(new BorderLayout());
            picture = new JLabel();
            picture.setHorizontalAlignment(JLabel.CENTER);
            picture.setVerticalAlignment(JLabel.CENTER);
            add(picture);

            JButton change = new JButton("Change");
            add(change, BorderLayout.SOUTH);

            change.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    changePicture();
                }
            });
        }

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

        protected void changePicture() {

            if (pictures != null && pictures.length > 0) {

                currentPicture++;
                if (currentPicture >= pictures.length) {
                    currentPicture = 0;
                }

                try {
                    // This is a potentionally blocking process and really should be threaded...
                    picture.setIcon(new ImageIcon(ImageIO.read(pictures[currentPicture])));
                    picture.setText(null);
                } catch (IOException ex) {
                    ex.printStackTrace();
                    picture.setText(ex.getMessage());
                }

            } else {

                picture.setText("No Pictures :(");

            }

        }

    }

}

更新しました

または、画像を自動的に切り替えたい場合

public class FlipPictures {

    public static void main(String[] args) {
        new FlipPictures();
    }

    public FlipPictures() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new PicturePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

            }
        });
    }

    public class PicturePane extends JPanel {

        private JLabel picture;

        public PicturePane() {
            setLayout(new BorderLayout());
            picture = new JLabel();
            picture.setHorizontalAlignment(JLabel.CENTER);
            picture.setVerticalAlignment(JLabel.CENTER);
            add(picture);

            BackgroundSwitcher switcher = new BackgroundSwitcher(this);
            switcher.execute();

        }

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

        public void setPicture(BufferedImage image) {

            picture.setIcon(new ImageIcon(image));

        }

    }

    public class BackgroundSwitcher extends SwingWorker<Void, BufferedImage> {

        private File[] pictures;
        private int currentPicture = -1;
        private PicturePane picturePane;

        public BackgroundSwitcher(PicturePane picturePane) {
            pictures = new File("/point/me/to/a/directory/of/images").listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    String name = pathname.getName().toLowerCase();
                    return name.endsWith(".png")
                            || name.endsWith(".gif")
                            || name.endsWith(".jpg")
                            || name.endsWith(".jpeg")
                            || name.endsWith(".bmp");
                }
            });
            this.picturePane = picturePane;
        }

        @Override
        protected void process(List<BufferedImage> chunks) {
            picturePane.setPicture(chunks.get(chunks.size() - 1));
        }

        @Override
        protected Void doInBackground() throws Exception {
            if (pictures != null && pictures.length > 0) {
                while (true) {

                    currentPicture++;
                    if (currentPicture >= pictures.length) {
                        currentPicture = 0;
                    }

                    try {
                        publish(ImageIO.read(pictures[currentPicture]));
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                    Thread.sleep(1000);
                }
            }
            return null;
        }
    }
}

Concurrency in Swing をご覧ください。

于 2013-02-12T03:57:19.093 に答える
2

あなたのコードは完全ではないので、推測するしかありません。次回はSSCCEを投稿します。

問題は、表示されているフレームにコンポーネントを追加していることだと思います。パネルで revalidate() を呼び出さなかったので、ラベルのサイズは (0, 0) のままです。

ただし、新しい JLabel を作成する必要はありません。既存のラベルの setIcon() メソッドを呼び出して画像を変更するだけで、ラベル自体が再描画されます。フレームやその他のコンポーネントで repaint() を呼び出す必要はありません。

于 2013-02-12T04:20:15.840 に答える