首页 文章

在规模内在JScrollPane中绘制图像

提问于
浏览
1

我有一个加载图像的滚动窗格 . 我没有这个图像与她的自然大小,如果这个图像太大,我不会激活滚动条,但这个指令

g.drawImage(immagine, 0, 0, getWidth(), getHeight(), this);

用于放置在滚动窗格中的缩放图像 . 我能做什么?

班贵:

import java.awt.*;
    import java.awt.event.*;
    import java.io.File;
    import javax.swing.*;

    public class Gui implements ActionListener {

        private JFrame frmEditor;

        private Mappa content;
        private JMenuItem mntmSfondo;
        private JScrollPane scrollabile;

        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        Gui window = new Gui();
                        window.frmEditor.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        /**
         * Create the application.
         */
        public Gui() {
            initialize();
        }

        /**
         * Initialize the contents of the frame.
         */
        private void initialize() {
            frmEditor = new JFrame();
            frmEditor.setFont(UIManager.getFont("TextArea.font"));
            frmEditor.setBounds(50, 50, 1024, 768);
            frmEditor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frmEditor.getContentPane().setLayout(new BorderLayout(0, 0));

            JPanel panelTile = new JPanel();
            panelTile.setLayout(new BorderLayout(0, 0));

            content = new Mappa(null);
            content.setMinimumSize(new Dimension(150, 150));
            scrollabile = new JScrollPane(content);
            frmEditor.getContentPane().add(scrollabile, BorderLayout.CENTER);

            inizializzaMenu();
        }

        /**
         * Initialize the menu.
         */
        private void inizializzaMenu() {

            JMenuBar menuBar = new JMenuBar();
            frmEditor.setJMenuBar(menuBar);

            JMenu mnAltro = new JMenu("Modify");
            menuBar.add(mnAltro);

            mntmSfondo = new JMenuItem("Load Background");
            mntmSfondo.addActionListener(this);
            mnAltro.add(mntmSfondo);
        }

        public void actionPerformed(ActionEvent e) {
            Object source = e.getSource();
            if (source == mntmSfondo) {
                JFileChooser fc = new JFileChooser("tuttiSfondi");
                int result = fc.showOpenDialog(null);
                if (result == JFileChooser.APPROVE_OPTION) {
                    File file = fc.getSelectedFile();
                    try {
                        content.setImage(file);
                        //content = new Mappa(file);
                        //scrollabile.setViewportView(content);
                    } catch (Exception ex) {
                    }
                }
                if (result == JFileChooser.CANCEL_OPTION) {
                }
            }
        }

    }

Mappa类:

import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.*;

    import javax.imageio.ImageIO;
    import javax.swing.*;

    public class Mappa extends JPanel {

        BufferedImage immagine;

        public Mappa(File fileImmagine) {

            if (fileImmagine != null ) {

                BufferedImage img = null;
                try {
                    img = ImageIO.read(new File(fileImmagine.getPath()));
                } catch (IOException e) {
                    e.printStackTrace();
                }
                this.immagine = img;
            }
            repaint();
        }

        public void setImage(File file) throws IOException {

            this.immagine = ImageIO.read(file);
            String name = file.getPath();
            System.out.println(name);
            repaint();

        }

        public void paintComponent(Graphics g) {

            super.paintComponent(g);
            g.clearRect(0, 0, 4000, 4000);
            g.drawImage(this.immagine, 0, 0, getWidth(), getHeight(), this);

            System.out.println("Called Repaint() on Mappa");

        }
    }

2 回答

  • 1

    JScrollPane 或更多的 JViewport 将使用组件(或在本例中为"view's")首选大小作为确定视图应该有多大的基础 .

    当视图扩展超出滚动窗格的大小时,它将显示滚动条 .

    所以基本上,你需要覆盖 public class Mappa extends JPanel { 面板的 getPreferredSize ,例如

    public class Mappa extends JPanel {
        //...
        public Dimension getPreferredSize() {
            return immagine == null ? new Dimension(200, 200) : new Dimension(immagine.getWidth(), immagine.getHeight());
        }
        //...
    }
    

    这将鼓励 JViewport 始终与图像大小相同 .

    还有两件事......

    首先,你不应该依赖魔术数字

    g.clearRect(0, 0, 4000, 4000);
    

    应该更像......

    g.clearRect(0, 0, getWidth(), getHeight());
    

    其次,

    super.paintComponent(g);
    

    会这样做,所以调用 clearRect 是没有意义的......

    您可能还想看一下Scrollable,但这是一个非常高级的主题

  • 2

    我不会以自然尺寸拍摄这张照片,如果这张照片太大,我就不会激活滚动条,

    使用 JLabel 来包含图像并将其包装在 JScrollPane 中应该可以轻松实现您想要的效果 . 从以下示例中获取提示:

    class AFrame extends JFrame
    {
       public AFrame()
      {
    
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         setTitle("Image view Demo with JScrollPane");
    
         ImageIcon image = new ImageIcon("myImage.png"); // pass the file location of an image
         JLabel label = new JLabel(image);
         JScrollPane scrollPane = new JScrollPane(label);
         scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
         scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
         add(scrollPane, BorderLayout.CENTER);
         pack();
      }
    
     public static void main(String[] args)
     {
        SwingUtilities.invokeLater(new Runnable() {
    
           @Override
           public void run() {
              new AFrame().setVisible(true);
           }
        });
    
      }
    }
    

相关问题