0

基本上,有两个不同的 BufferedImage 称为 img_w 和 img_b1 ...一旦我将 Jframe/label 设置为其中之一,它就永远不会改变或永远不会 repants() 到新的 Imagebuffered 值...

提前致谢..

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;
        }
    }
}

你可能想看看Swing 中的并发

于 2013-02-12T03:57:19.093 回答
2

您的代码不完整,所以我们所能做的就是猜测。下次发布SSCCE

我猜问题在于您正在将组件添加到可见框架中。您没有在面板上调用 revalidate(),因此标签的大小保持 (0, 0)。

但是,无需创建新的 JLabel。只需通过调用现有标签的 setIcon() 方法来更改图像,标签就会自行重新绘制。无需在框架或任何其他组件上调用 repaint()。

于 2013-02-12T04:20:15.840 回答