2014-10-24 3 views
-1

Я читал читать и читать еще несколько, чтобы привести к большей путанице. Вот моя проблема: у меня есть три класса, следующие за дизайном контроллера модели. У меня возникли проблемы с загрузкой изображения из модели и отображением на экране. Я читал использовать значок, копировать из bufferedimage в bufferedimage, отображать его на jpanel, но никто не работал. Heres основной контур:BufferedImage не отображается в gui

Модель:

import java.awt.Graphics; 
import javax.imageio.ImageIO; 
import java.io.File; 
import java.awt.image.BufferedImage; 

class Testee{ 
    final public String desktopImage = "TestPicture.jpg"; 
    private String imageURI; 
    private static BufferedImage bImage; 
    private Graphics graphics; 
    private int xLocation, yLocation; 

    public Testee(){ 

    } 
    public void setImageURI(String uri){ 
     imageURI = uri; 
    } 
    public Graphics getImageGraphics(){ 
     return graphics; 
    } 
    public BufferedImage getImage(){ 
     return bImage; 
    } 

    public void setImageBuffer(String imageName){ 
     try{ 
      bImage = ImageIO.read(new File(imageName)); 
      graphics = bImage.createGraphics(); 
     } 
     catch(Exception ex){} 

    } 
    public void clearImage(){ 
     bImage = null; 
     graphics = null; 
    } 

    public void setSelectedLocation(int x, int y){ 
     xLocation = x; 
     yLocation = y; 
    } 
    public int getSelectedX(){ 
     return xLocation; 
    } 
    public int getSelectedY(){ 
     return yLocation; 
    } 

    public int getPixelCount(BufferedImage image){ 
     if(image != null){ 
      int pixelCount = image.getWidth() * image.getHeight(); 
      return pixelCount; 
     } 
     else 
      return 0; 
    } 

    public int getSelectedPixel(BufferedImage image, int x, int y){ 
     if(image != null){ 
      int pixelNumber; 
      int IMAGEWIDTH = image.getWidth(); 
      //if(y <= 1){ 
       //needs work 
      //} 
      pixelNumber = (IMAGEWIDTH * (y - 1)) + x; 
      return pixelNumber; 
     } 
     else{ 
      return 0; 
     } 
    } 
    public int getPixelLocation(BufferedImage image, int x, int y){ 
     if(image != null){ 
      return image.getRGB(x, y); 
     } 
     else{ 
      return 0; 
     } 
    } 

    public int getPixelRGB(int pixel){ 
     int rgb = pixel; 
     return rgb; 
    } 
    public int getPixelAlpha(int pixel){ 
     int alpha = (pixel >> 24) & 0xff; 
     return alpha; 
    } 
    public int getPixelRed(int pixel){ 
     int red = (pixel >> 16) & 0xff; 
     return red; 
    } 
    public int getPixelGreen(int pixel){ 
     int green = (pixel >> 8) & 0xff; 
     return green; 
    } 
    public int getPixelBlue(int pixel){ 
     int blue = (pixel) & 0xff; 
     return blue; 
    } 

    void blankSlate(){ 
     clearImage(); 
     graphics = null; 
    } 

} 

Вид:

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 
import java.lang.reflect.InvocationTargetException; 
import javax.swing.*; 

class Testing{ 
    private Testee testee; 
    private JFrame mainFrame; 
    private JPanel mainPane; 

    private Thread canvasThread; 
    private JPanel picturePane; 
    private JPanel canvas; 

    private JPanel imageControlPane; 
    private JPanel imageButtonHolder; 
    private JButton uploadButton; 
    private JButton clearButton; 

    private JPanel infoPane; 
    private JPanel pixelCountPane; 
    private JPanel pixelLocationPane; 
    private JPanel pixelSelectedPane; 
    private JPanel pixelRGBPane; 
    private JPanel pixelAlphaPane; 
    private JPanel pixelRedPane; 
    private JPanel pixelGreenPane; 
    private JPanel pixelBluePane; 
    private JPanel pixelColorPane; 
    final private JLabel pixelCountLabel = new JLabel("# of pixels"); 
    private JTextField pixelCountText; 
    final private JLabel pixelSelectedLabel = new JLabel("pixel selected"); 
    private JTextField pixelSelectedText; 
    final private JLabel pixelLocationLabel = new JLabel("pixel location"); 
    private JTextField pixelLocationText; 
    final private JLabel pixelRGBLabel = new JLabel("pixel RGB"); 
    private JTextField pixelRGBText; 
    final private JLabel pixelAlphaLabel = new JLabel("Alpha"); 
    private JTextField pixelAlphaText; 
    final private JLabel pixelRedLabel = new JLabel("Red"); 
    private JTextField pixelRedText; 
    final private JLabel pixelGreenLabel = new JLabel("Green"); 
    private JTextField pixelGreenText; 
    final private JLabel pixelBlueLabel = new JLabel("Blue"); 
    private JTextField pixelBlueText; 


    public Testing(Testee model){ 
     testee = model; 
     try { 
      SwingUtilities.invokeAndWait(new Runnable() { 
       @Override 
       public void run(){ 
        setupGUI(); 
       } 
      }); 
     } catch (InterruptedException | InvocationTargetException ex) { 
      System.exit(1); 
     } 
    } 

    private void setupGUI(){ 
     System.out.println("Created GUI on EDT? " 
      + SwingUtilities.isEventDispatchThread()); 

     mainFrame = new JFrame(); 
     mainPane = new JPanel(new BorderLayout()); 

     mainFrame.setTitle(this.getClass().getSimpleName()); 
     mainFrame.setSize(500,500); 
     mainFrame.setResizable(false); 
     mainFrame.addWindowListener(new WindowAdapter(){ 
      @Override 
      public void windowClosing(WindowEvent windowEvent){ 
       System.exit(0); 
      } 
     }); 

     picturePane = new JPanel(new FlowLayout()); 
     canvas = new DrawBoard(); 
     generateCanvas(); 
     picturePane.add(canvas); 
     mainPane.add(picturePane,BorderLayout.CENTER); 

     imageControlPane = new JPanel(new BorderLayout()); 
     imageButtonHolder = new JPanel(new GridLayout(1,2,10,5)); 
     uploadButton = new JButton("UPLOAD"); 
     clearButton = new JButton("CLEAR"); 
     imageButtonHolder.add(uploadButton); 
     imageButtonHolder.add(clearButton); 
     imageControlPane.add(imageButtonHolder, BorderLayout.WEST); 
     mainPane.add(imageControlPane, BorderLayout.SOUTH); 

     infoPane = new JPanel(); 
     BoxLayout boxLayout = new BoxLayout(infoPane, BoxLayout.Y_AXIS); 
     infoPane.setLayout(boxLayout); 

     pixelCountPane = new JPanel(new BorderLayout(5,5)); 
     pixelCountText = new JTextField(8); 
     pixelCountText.setEditable(false); 
     pixelCountPane.add(pixelCountLabel, BorderLayout.WEST); 
     pixelCountPane.add(pixelCountText, BorderLayout.EAST); 
     infoPane.add(pixelCountPane); 

     pixelSelectedPane = new JPanel(new BorderLayout(5,5)); 
     pixelSelectedText = new JTextField(8); 
     pixelSelectedText.setEditable(false); 
     pixelSelectedPane.add(pixelSelectedLabel, BorderLayout.WEST); 
     pixelSelectedPane.add(pixelSelectedText, BorderLayout.EAST); 
     infoPane.add(pixelSelectedPane); 

     pixelLocationPane = new JPanel(new BorderLayout(5,5)); 
     pixelLocationText = new JTextField(8); 
     pixelLocationText.setEditable(false); 
     pixelLocationPane.add(pixelLocationLabel, BorderLayout.WEST); 
     pixelLocationPane.add(pixelLocationText, BorderLayout.EAST); 
     infoPane.add(pixelLocationPane); 

     pixelRGBPane = new JPanel(new BorderLayout(5,5)); 
     pixelRGBText = new JTextField(8); 
     pixelRGBText.setEditable(false); 
     pixelRGBPane.add(pixelRGBLabel, BorderLayout.WEST); 
     pixelRGBPane.add(pixelRGBText, BorderLayout.EAST); 
     infoPane.add(pixelRGBPane); 


     pixelAlphaText = new JTextField(8); 
     pixelAlphaText.setEditable(false); 
     pixelRedText = new JTextField(8); 
     pixelRedText.setEditable(false); 
     pixelGreenText = new JTextField(8); 
     pixelGreenText.setEditable(false); 
     pixelBlueText = new JTextField(8); 
     pixelBlueText.setEditable(false); 

     //pixelColorPane = new JPanel(new GridLayout(4,1)); 

     pixelAlphaPane = new JPanel(new BorderLayout(5,5)); 
     pixelAlphaPane.add(pixelAlphaLabel, BorderLayout.WEST); 
     pixelAlphaPane.add(pixelAlphaText, BorderLayout.EAST); 
     infoPane.add(pixelAlphaPane); 

     pixelRedPane = new JPanel(new BorderLayout(5,5)); 
     pixelRedPane.add(pixelRedLabel, BorderLayout.WEST); 
     pixelRedPane.add(pixelRedText, BorderLayout.EAST); 
     infoPane.add(pixelRedPane); 

     pixelGreenPane = new JPanel(new BorderLayout(5,5)); 
     pixelGreenPane.add(pixelGreenLabel, BorderLayout.WEST); 
     pixelGreenPane.add(pixelGreenText, BorderLayout.EAST); 
     infoPane.add(pixelGreenPane); 

     pixelBluePane = new JPanel(new BorderLayout(5,5)); 
     pixelBluePane.add(pixelBlueLabel, BorderLayout.WEST); 
     pixelBluePane.add(pixelBlueText, BorderLayout.EAST); 
     infoPane.add(pixelBluePane); 

     //infoPane.add(pixelColorPane); 

     mainPane.add(infoPane,BorderLayout.EAST); 

     mainFrame.getContentPane().add(mainPane); 
     mainFrame.setVisible(true); 

    } 
    public class DrawBoard extends JPanel{ 
     BufferedImage image; 
     public DrawBoard(){ 
      image = testee.getImage(); 

     } 

     @Override 
     protected void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      g.drawImage(image, 0, 0, this); 
     } 
    } 
    private void generateCanvas(){ 
     canvasReset(); 
     canvasThread = new Thread(new Runnable(){ 
      @Override 
      public void run() { 

      } 
     }); 
     canvasThread.start(); 
    } 
    public JPanel getCanvas(){ 
     return canvas; 
    } 
    public void canvasReset(){ 
     canvas.setPreferredSize(new Dimension(300,300)); 
     canvas.setBackground(Color.white); 
     canvas.repaint(); 
    } 

    void setPixelCount(String text){ 
     pixelCountText.setText(text); 
    } 
    void setPixelSelected(String text){ 
     pixelSelectedText.setText(text); 
    } 
    void setPixelLocation(int x, int y){ 
     pixelLocationText.setText(x + ", " + y); 
    } 
    void setPixelRGB(String text){ 
     pixelRGBText.setText(text); 
    } 
    void setPixelAlpha(String text){ 
     pixelAlphaText.setText(text); 
    } 
    void setPixelRed(String text){ 
     pixelRedText.setText(text); 
    } 
    void setPixelGreen(String text){ 
     pixelGreenText.setText(text); 
    } 
    void setPixelBlue(String text){ 
     pixelBlueText.setText(text); 
    } 

    void canvasAction(MouseListener mla){ 
     canvas.addMouseListener(mla); 
    } 
    void uploadAction(ActionListener ual){ 
     uploadButton.addActionListener(ual); 
    } 
    void clearAction(ActionListener al){ 
     clearButton.addActionListener(al); 

    } 

    void blankGUI(){ 
     canvasReset(); 
     pixelCountText.setText(null); 
     pixelSelectedText.setText(null); 
     pixelLocationText.setText(null); 
     pixelRGBText.setText(null); 
     pixelAlphaText.setText(null); 
     pixelRedText.setText(null); 
     pixelBlueText.setText(null); 
     pixelGreenText.setText(null); 
    } 

} 

Контроллер:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

class Tester{ 
    public Testing testing; 
    public Testee testee; 

    public Tester(Testing gui, Testee model){ 
     testing = gui; 
     testee = model; 
     gui.uploadAction(new Upload()); 
     gui.clearAction(new Clear()); 
     gui.canvasAction(new Mouse()); 
    } 


    public class Upload implements ActionListener{ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      testee.setImageBuffer(testee.desktopImage); 
      testing.setPixelCount(Integer.toString(testee.getPixelCount(testee.getImage()))); 
      if(testee.getImage() != null){ 

      } 
     } 

    } 
    public class Clear implements ActionListener{ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      testing.blankGUI(); 
      testee.blankSlate(); 
     } 

    } 
    public class Mouse extends MouseAdapter{ 
     @Override 
     public void mouseClicked(MouseEvent me){ 
      testee.setSelectedLocation(me.getX(), me.getY()); 
      testing.setPixelLocation(testee.getSelectedX(), testee.getSelectedY()); 
      testing.setPixelSelected(Integer.toString(testee.getSelectedPixel(testee.getImage(), testee.getSelectedX(), testee.getSelectedY()))); 


      try{ 
       int pixelColor = testee.getPixelLocation(testee.getImage(), testee.getSelectedX(), testee.getSelectedY()); 

       testing.setPixelRGB(Integer.toString(testee.getPixelRGB(pixelColor))); 
       testing.setPixelAlpha(Integer.toString(testee.getPixelAlpha(pixelColor))); 
       testing.setPixelRed(Integer.toString(testee.getPixelRed(pixelColor))); 
       testing.setPixelGreen(Integer.toString(testee.getPixelGreen(pixelColor))); 
       testing.setPixelBlue(Integer.toString(testee.getPixelBlue(pixelColor))); 
      } 
      catch(NullPointerException ex){ 

      } 
     } 
    } 

} 

Я пробовал много различных решений, но ничего не красит JPanel. также изображение является jpg на моем рабочем столе, путь правильный, может загружать данные из изображения, просто не могу заставить его отображаться на gui. Другие вопросы, чтобы следовать ... Спасибо

EDIT: Извините, если дубликат, не могу показаться, чтобы найти правильный ответ

+1

Что говорит 'DrawBoard' рисовать изображение при его изменении? Рассмотрите возможность предоставления [runnable example] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему.Это приведет к меньшему путанице и лучшим ответам – MadProgrammer

+0

ok, плохое сообщение мой код – TechnicalCustoms

+0

Почему 'bImage'' static'? – MadProgrammer

ответ

3

Так что, когда я, наконец, получил весь код вместе взятые ... Я сделал что-то вроде ...

Testee t = new Testee(); 
t.setImageBuffer("path/to/my/image"); 

new Testing(t); 

И это работало нормально ...

Image

  • Я не вижу никакой причины для Testee.bImage быть static и на самом деле, я вижу много причин, почему это не должно быть ...
  • Вы отбрасываете исключение, которое может быть поднято ImageIO.read, что может на самом деле сказать, что происходит не так ...
  • Там нет никакого способа для Testee сказать заинтересованным сторонам, что его содержание изменилось, как графика на самом деле был очищен ...
  • Использование JFrame#setDefaultCloseOpertation и установив его на EXIT_ON_CLOSE бы сохранить вам необходимо использовать WindowAdaptor для выхода из системы, также не рекомендуется использовать SwingUtilities.invokeAndWait, но это только я ...
  • Вы должны рассмотреть возможность использования pack над setSize, он вычисляет размер окна на основе потребностей его содержание ...
  • DrawBoard должен переопределить метод getPreferredSize и возвращать более надежное значение

В рамках MVC, контроллеру необходимо передавать информацию между моделью и представлением, координируя функциональность. Для контроллера не должно быть представления о логике представления (какие элементы управления существуют или что они делают), он должен иметь только контракт, с помощью которого он может связывать состояния с ним и получать ответ обратно (то же самое относится к модели)

Итак, в принципе, у вас есть три класса, некоторые из них могут повлиять на один или два, но никто не знает, что происходит ...

+0

Да, я добавляю метод prefferedSize прямо сейчас, и спасибо за все советы – TechnicalCustoms

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