2015-11-24 8 views
1

Я пытаюсь создать приложение веб-камеры для университетского проекта в java. До сих пор я никогда не нуждался в графическом интерфейсе, поэтому у меня нет опыта в этом, и для этого я использовал построитель gui внутри netbeans.Динамически добавить JPanel в группуLayout

Сейчас графический интерфейс выглядит следующим образом:

http://i.stack.imgur.com/3MCiv.png

Это только JPanel и JButton добавил внутри GUI Builder.

Изображение, которое я хочу отобразить, берется с использованием openCV. Это работает отлично, и я получаю bufferedImage. Чтобы отобразить это изображение, я создал подкласс jPanel и изменил метод paintComponent.

package WebcamImageCapture; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import javax.swing.JPanel; 

public class ImagePanel extends JPanel 
{ 
    /** 
    * Creates a new empty ImagePanel. 
    */ 
    public ImagePanel() 
    { 
     this.image = null; 
    } 

    /** 
    * Creates a new ImagePanel from BufferedImage img. 
    * @param img The BufferedImage to display on the ImagePanel 
    */ 
    public ImagePanel(BufferedImage img) 
    { 
     this.image = img; 
    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g.drawImage(this.image, 0, 0, this.image.getWidth(), this.image.getHeight(), null); 

     g.setColor(new Color(240, 160, 40)); 
     g.fillRect(10, 10, 25, 25); 

     this.repaint(); 
    } 

    /** 
    * Sets the BufferedImage img to display on ImagePanel. 
    * @param img The BufferedImage to display on the ImagePanel 
    */ 
    public void setImage(BufferedImage img) 
    { 
     this.image = img; 
    } 

    private BufferedImage image; 
} 

Класс GUI имеет элемент openCameraButton и outputPanel, которые являются элементы, которые вы можете увидеть на скриншоте. Я попробовал следующее добавить мой imagePanel в outputPanel внутри метода, который обрабатывает событие ActionPerformed кнопки.

// create the custom jPanel 
ImagePanel webcamFrame = new ImagePanel(img); 
webcamFrame.setPreferredSize(new Dimension(640, 480)); 

this.outputPanel.getLayout().addLayoutComponent("webcamFrame", webcamFrame); 
this.outputPanel.revalidate(); 
this.outputPanel.repaint(); 

this.revalidate(); 
this.repaint(); 

Это не работает = (я гугле вокруг и проходят в течение 2 дней (также чтение документации оракула на макетах:.. documentation) не найти решение

Так основные вопросы:

  1. Как я добавить ImagePanel?
  2. Если я вручную реализовать графический интерфейс с другим макетом?

Заранее благодарим вас за помощь.

ответ

4

2. Должен ли я вручную реализовать графический интерфейс с другой компоновкой?

Да, код, созданный IDE, трудно поддерживать и изменять.

фрейм это использует BorderLayout по умолчанию, так что вы могли бы сделать что-то вроде:

ImagePanel = new ImagePanel(); 
frame.add(imagePanel, BorderLayout.CENTER); 

JPanel south = new JPanel(); 
JButton load = new JButton("Load Image"); 
south.add(load); 
frame.add(south, BorderLayout.PAGE_END); 

Так идеи добавить панель к раме во время разработки. Затем всякий раз, когда вы захватываете изображение, вы вызываете метод setImage(). Код в методе setImage() будет:

this.image = img; 
repaint(); 

Ваш paintComponent() код изменится на:

if (image != null); 
    g.drawImage(this.image, 0, 0, this.image.getWidth(), this.image.getHeight(), null); 

получить также избавиться от перекрашивать(). Это вызовет бесконечный цикл.

0

я изменил код, как вы рекомендовали ...

package WebcamImageCapture; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import javax.swing.JPanel; 

public class ImagePanel extends JPanel 
{ 
    /** 
    * Creates a new empty ImagePanel. 
    */ 
    public ImagePanel() 
    { 
     this.image = null; 
    } 

    /** 
    * Creates a new ImagePanel from BufferedImage img. 
    * @param img The BufferedImage to display on the ImagePanel 
    */ 
    public ImagePanel(BufferedImage img) 
    { 
     this.image = img; 
    } 

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

      g.setColor(new Color(240, 160, 40)); 
      g.fillRect(10, 10, 25, 25); 

      System.out.println("image drawn ..."); 
     } 
     else 
     { 
      System.out.println("image not drawn ..."); 
     } 
    } 

    /** 
    * Sets the BufferedImage img to display on ImagePanel. 
    * @param img The BufferedImage to display on the ImagePanel 
    */ 
    public void setImage(BufferedImage img) 
    { 
     this.image = img; 
     this.repaint(); 
    } 

    private BufferedImage image; 
} 

... и создал GUI вручную.

private void init() 
{ 
    this.imageOutput = new ImagePanel(); 
    this.add(imageOutput, BorderLayout.CENTER); 

    this.openCameraButton = new JButton("open camera"); 
    this.openCameraButton.addActionListener(new java.awt.event.ActionListener() { 
     @Override 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      openCameraButtonActionPerformed(evt); 
     } 
    }); 

    JPanel navigation = new JPanel(); 
    navigation.add(this.openCameraButton, BorderLayout.PAGE_END); 

    this.add(navigation); 
    this.setTitle("Webcam"); 
    this.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    this.pack(); 
} 

Внутри метода openCameraButtonActionPerformed я взял изображение и использовал setImage метод ImagePanel, чтобы установить его.

this.imageOutput.setImage(img);

Но, к сожалению, ничего не происходит. Если я сделаю следующее, я получу новое окно с изображением внутри.

JFrame myFrame = new JFrame("myFrame"); 
ImagePanel out = new ImagePanel(img); 
myFrame.add(out); 
myFrame.pack(); 
myFrame.setVisible(true); 

Что я делаю неправильно?

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