2012-04-08 2 views
2

Мне нужно выбрать изображение с диалоговым окном открытия файла, а затем показать его в окне. Но когда я выбираю изображение, оно не отображается в окне.проблемы с отображением изображения в окне

Я создал класс, который создает окно с jmenubar и 1 jmenuitem. Когда я нажимаю на menuitem, появляется JfileChooser, а затем я выбираю какой-то файл. Но тогда ничего не происходит. Я думаю, что проблема в ActionListener для JFileChooser (ImageFilter является фильтром из DOCS Java)

public Frame(){ 
    //create bars and window 
    mainframe = new JFrame("Window"); 
    mainframe.setVisible(true); 
    mainframe.setSize(300, 300); 
    menubar = new JMenuBar(); 
    mainer = new JMenu("Menu"); 
    menubar.add(mainer); 
    //create items 
    item = new JMenuItem("Open",KeyEvent.VK_T); 
    item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, ActionEvent.ALT_MASK)); 
    item.getAccessibleContext().setAccessibleDescription("open image"); 
    //action listener 
    item.addActionListener(
      new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        //open file dialog 
        choser = new JFileChooser(); 
        choser.addChoosableFileFilter(new ImageFilter()); 
        final int returnval = choser.showOpenDialog(menubar); 
        //action listener for JFileChooser 
        choser.addActionListener(
          new ActionListener() { 
           @Override 
           public void actionPerformed(ActionEvent e) { 
            if (returnval == JFileChooser.APPROVE_OPTION){ 
             fc = choser.getSelectedFile(); 
             try{ 
              Panel panel = new ShowImage(fc.getName()); 
              mainframe.getContentPane().add(panel); 
             }catch(Exception exc){}; 
            } 
           } 
          } 
        ); 
       } 
      } 
    ); 
    mainer.add(item); 
    mainframe.setJMenuBar(menubar); 
} 

ShowImage класс

class ShowImage extends Panel{ 
    BufferedImage image; 
    public ShowImage(String imagename) throws IOException { 
     File input = new File(imagename); 
     image = ImageIO.read(input); 
    } 
    public void paint(Graphics g){ 
     g.drawImage(image,0,0,image.getWidth(),image.getHeight(),null); 
    } 
} 

PS Еще одна проблема в том, что он ничего не показывает, пока я не изменить размер окна ,

+1

'SetVisible()/SetSize()' такие вещи должны в самом конце, когда вы добавили товар в контейнер , Поместите эти вещи в конец конструктора, чтобы все работало гладко после того, как 'mainFrame.setJMenuBar (...)', 'setVisible (true)' должен прийти в самом конце, после того как вы добавили все. Если вы не знаете, что лучше попробуйте еще раз изучить учебники Swing. –

ответ

2

Продлить JPanel вместо Panel, и переопределить paintComponent метод, то есть:

class ShowImage extends JPanel{ 
    public void paintComponent(Graphics g){ 
     ... 
    } 
} 

Кроме того, нет необходимости addActionListener на JFileChooser, просто проверить возвращаемое значение и действовать соответствующим образом, то есть:

final int returnval = choser.showOpenDialog(menubar); 
if (returnval == JFileChooser.APPROVE_OPTION){ 
    ... 
} 
+0

Лучше просто использовать 'JLabel' в' JScrollPane' для отображения изображения. Нет необходимости переопределять что угодно, и полосы прокрутки появятся автоматически, если изображение слишком велико для размера назначенной области. –

2

Im довольно уверен, что эта линия вызовет проблемы:

Panel panel = new ShowImage(fc.getName()); 

getName() вернет имя файла. Например, если вы выберете изображение с помощью JFileChooser с именем image.jpg, getName вернет «image.jpg». Это заставит изображение отображать только если выбранный вами файл хранится в корневой папке вашего проекта. Я бы изменил getName() на getAbsoultePath(), который вернет полный патч (e.i c: \ desktop \ image.jpg), который наиболее похож на то, что вы хотите.

Кроме того, как Макс указывает, вы должны переопределить paintComponent, а затем краской:

protected void paintComponent(Graphics g){  
    g.drawImage(image,0,0,image.getWidth(),image.getHeight(),null); 
} 
+0

* "вы должны переопределить paintComponent, а не красить:" * Вы также должны использовать 'ImageObserver', когда он доступен. Exchange 'null' для' this' при рисовании в компоненте, и у вас его есть. –

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