2014-10-18 5 views
-1

Я написал класс JPanel, где загружаю изображение. Я пытаюсь добавить свитки на эту панель, но это не сработало. Кто-нибудь может мне помочь? Извините за мой плохой язык.Java ScrollPane на JPanel

browser.setFileFilter(imgFilter); // ustawienie filtra 
browser.setAcceptAllFileFilterUsed(false); 
browser.setCurrentDirectory(new File(".")); 
int result = browser.showOpenDialog(imagePanel); 

if (result == JFileChooser.APPROVE_OPTION) { 
    // tworzenie obrazu 

    imagePanel = new ImagePanel(browser.getSelectedFile()); 
    JScrollPane scrollPane = new JScrollPane(imagePanel); 
    scrollPane.setSize(new Dimension(300, 400)); 
    //add(imagePanel); 
    add(scrollPane); 
    //imagePanel.repaint(); 
    scrollPane.repaint(); 
} 

И это мой imagePanel класс:

private class ImagePanel extends JPanel { 
    private Image img; 
    private File file; 

    public ImagePanel(File file) { 
     this.file = file; 
     setSize(SCREEN_HEIGHT/2, SCREEN_WIDTH * 3/4); 

     try { 
      img = ImageIO.read(file); 
     } 
     catch(IOException e) { 
      System.out.println("Wystąpił błąd podczas wczytywanie obrazu."); 
      e.printStackTrace(); 
     } 
    } 

    public void paintComponent(Graphics g) { 
     if(img == null) return; 

     g.drawImage(img, 0, 0, null); 
    } 
} 
+0

Что происходит? любая ошибка? Вы могли видеть панель –

+0

u хотите добавить Jpanel внутри Jscrollpane? – Krishna

+0

@getlost Ничего не происходит. Он просто не работает, изображение не отображается. – user2316721

ответ

2

Вы должны быть перекрывая getPreferredSize() в ImagePanel дать панели предпочтительный размер, который панель прокрутки будет использоваться, чтобы определить, является ли или нет добавить свитки. Как правило, при выполнении пользовательской картины, вы всегда хотите, чтобы переопределить getPreferredSize панели рисования холст, так как по умолчанию 0x0

Пример:

public class Test { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       // image is 256 x 256 
       Image image = new ImageIcon("stackoverflow.png").getImage(); 
       JPanel imagePanel = new JPanel() { 
        @Override 
        protected void paintComponent(Graphics g) { 
         super.paintComponent(g); 
         g.drawImage(image, 0, 0, this); 
        } 
        @Override 
        public Dimension getPreferredSize() { 
         return new Dimension(image.getWidth(this), 
              image.getHeight(this)); 
        } 
       }; 
       JScrollPane pane = new JScrollPane(imagePanel); 
       pane.setPreferredSize(new Dimension(200, 200)); 
       JOptionPane.showMessageDialog(null, pane); 
      } 
     }); 
    } 
} 

С GetPreferredSize

enter image description here

Без getPreferredSize

enter image description here


UPDATE

Пару, что я вижу неправильно с текущим кодом.

  1. Создание нового ImagePanel, если вы хотите установить изображение. Вместо этого просто используйте метод setImage в классе ImagePanel, где вы можете просто установить изображение и перекрасить.

  2. Пробуя add(scrollPane); во время выполнения без revalidate().

См. Полный пример здесь.

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 
import javax.swing.filechooser.FileNameExtensionFilter; 

public class Test { 
    public Test() { 
     JFrame frame = new JFrame(); 
     ImagePanel panel = new ImagePanel(); 
     JScrollPane pane = new JScrollPane(panel); 
     pane.setPreferredSize(new Dimension(200, 200)); 
     JButton button = createButton(panel, pane); 

     frame.add(pane); 
     frame.add(button, BorderLayout.PAGE_END); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private JButton createButton(ImagePanel panel, JScrollPane pane) { 
     JButton button = new JButton("Change image"); 
     button.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       JFileChooser chooser = new JFileChooser(); 
       FileNameExtensionFilter filter = new FileNameExtensionFilter(
         "JPG & GIF Images", "jpg", "gif"); 
       chooser.setFileFilter(filter); 
       int returnVal = chooser.showOpenDialog(null); 
       if (returnVal == JFileChooser.APPROVE_OPTION) { 
        Image image = new ImageIcon(
          chooser.getSelectedFile().getAbsolutePath()).getImage(); 
        panel.setImage(image); 
        pane.revalidate(); 
       } 
      } 
     }); 
     return button; 
    } 

    private class ImagePanel extends JPanel { 
     Image image; 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (image != null) { 
       g.drawImage(image, 0, 0, this); 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return image == null ? new Dimension(150, 150) 
           : new Dimension(image.getWidth(this), 
               image.getHeight(this)); 
     } 

     public void setImage(Image img) { 
      this.image = img; 
      repaint(); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Test(); 
      } 
     }); 
    } 
} 
+0

Я смотрю ваше решение и пытаюсь исправить свой код, но он все еще не работает. – user2316721

+0

Опубликуйте простой пример, который демонстрирует проблему, и использует ваши исправления. И избавиться от 'setSize' –

+0

Возможно, что-то с твоей новой панелью. Вместо этого просто добавьте метод в класс 'ImagePanel'' setImage (Image img) ', затем вызовите этот метод для установки изображения панели. Нет необходимости создавать новую панель. Помните 'repaint()' внутри метода –

Смежные вопросы