Массив ImageIcons, изменение содержимого массива при перетаскивании - PullRequest
0 голосов
/ 11 марта 2012

У меня есть массив ImageIcons, и я могу перетаскивать на них другие значки, чтобы заменить их. Когда я нажимаю кнопку, создается новый JFrame из массива ImageIcons.

Если я делаю это без перетаскивания других значков в исходный массив, это работает. Однако, как только я помещаю другое изображение в массив, я получаю ошибку, когда нажимаю кнопку.

Мне просто интересно, возможно ли это вообще вообще?

Я рассмотрел другие подходы использования JTable для верхней панели или попытки использовать ArrayList, но мне не очень удобно их использовать. Если у кого-то есть мнение о том, как это сделать, пожалуйста, дайте мне знать!

Я сократил этот пример настолько, насколько это возможно (на 200 строках он не совсем короткий). Но это именно то, что моя проблема ...

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Properties;
import java.awt.Toolkit; 
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.*;
import java.lang.String.*;
public class test extends JFrame {

JPanel storyPanel, rightStoryPanel, leftStoryPanel,centerStoryPanel, imageSelectPanel, CreatePanel, storyFramePanel, storycard;
TransferHandler handler;
MouseListener listener;
CardLayout cl3;
JLabel[] storyLabel = new JLabel[20];
JButton playStory, nextStory,addtargetbutton;
int count, start, i, j,stop, start1;

      public test(){


            CreatePanel = new JPanel(new BorderLayout());
            storyPanel = new JPanel(new BorderLayout());
            rightStoryPanel = new JPanel(new GridLayout(6,1));
            leftStoryPanel = new JPanel(new GridLayout(6,1));
            centerStoryPanel = new JPanel();
            JScrollPane centerscroll = new JScrollPane(centerStoryPanel);
            addtargetbutton = new JButton("Add Another Image Slot");
            addtargetbutton.addActionListener(new createbuttons());
            playStory = new JButton("Play your story!");
            leftStoryPanel.add(playStory);
            playStory.addActionListener(new createbuttons());
            leftStoryPanel.add(addtargetbutton);
            imageSelectPanel = new JPanel(new FlowLayout());
            storyPanel.add(rightStoryPanel,BorderLayout.EAST);
            storyPanel.add(leftStoryPanel, BorderLayout.WEST);
            storyPanel.add(centerscroll, BorderLayout.CENTER);
            CreatePanel.add(storyPanel, BorderLayout.NORTH);
            CreatePanel.add(imageSelectPanel, BorderLayout.CENTER);


            count= 3;
            start= 0;
            stop = 0;
            start1= 0;
            ImageSelection();
            targetpanel();
            getContentPane().add(CreatePanel);

        }//End Create}

      public void ImageSelection(){ 



        int i = 0;
        int j = 0;

        TransferHandler handler = new TransferHandler("icon") {
            @Override
            public boolean canImport(TransferSupport support) {
                return super.canImport(support) 
                    && support.getComponent().getParent() != imageSelectPanel;}
                };

        MouseListener listener = new MouseAdapter(){
            public void mousePressed(MouseEvent e){
            JComponent c = (JComponent) e.getSource();
            TransferHandler handler = c.getTransferHandler();
            handler.exportAsDrag(c, e, TransferHandler.COPY);
            System.out.println(e);}
        }; // Drag & Drop mouse


            try{    

                String imagePath = "";          
                BufferedImage[] CreateImagesFromDB = new BufferedImage[40];
                JLabel[] ImageLabel = new JLabel[40];

                while (count > start1) {
                    i = 1;
                    CreateImagesFromDB[i] = ImageIO.read(new File("one.jpg"));
                    ImageLabel[i] = new JLabel(new ImageIcon(CreateImagesFromDB[i]));
                    imageSelectPanel.add(ImageLabel[i]);    
                    ImageLabel[i].addMouseListener(listener);
                    ImageLabel[i].setTransferHandler(handler);
                    i++;
                    start1++;
                    }
            }//EndTRY
            catch(Exception e){
                System.out.println("CATCH"+ e);
            }//end catch

    }


      public void targetpanel(){
            TransferHandler handler = new TransferHandler("icon") {
            @Override
            public boolean canImport(TransferSupport support) {
                return super.canImport(support) 
                    && support.getComponent().getParent() != imageSelectPanel;
            }
            };
            MouseListener listener = new MouseAdapter(){
            public void mousePressed(MouseEvent e){
                JComponent c = (JComponent) e.getSource();
                TransferHandler handler = c.getTransferHandler();
                handler.exportAsDrag(c, e, TransferHandler.COPY);
            }
            };

          BufferedImage[] storyImages = new BufferedImage[20];


          try{ 

              while(count > start){  
                storyImages[j] = ImageIO.read(new File("TargetImg.jpg"));
                storyLabel[j] = new JLabel(new ImageIcon(storyImages[j]));
                centerStoryPanel.add(storyLabel[j]); 
                storyLabel[j].addMouseListener(listener);
                storyLabel[j].setTransferHandler(handler);
                j++;
                start++;
                centerStoryPanel.revalidate();
                //validate();
                System.out.println("J in Loop is: "+j );

              }//end while Loop  
                //System.out.println("J is equalto: "+j);
            } catch(Exception e) {};
      }// End TargetPanel


          public void storyFrame (JLabel[] storyArray){
                int i = 0;
        storyFramePanel = new JPanel(new BorderLayout());
        nextStory = new JButton("Next Image");
        nextStory.addActionListener(new createbuttons());
        storycard = new JPanel();
        cl3 = new CardLayout();
        storycard.setLayout(cl3);

        JPanel[] storyImgPanel = new JPanel[20];
        JLabel[] imglab = new JLabel[20];
        storyImgPanel[i]= new JPanel();

        while( i < j){

            storyImgPanel[i].add(new JLabel(storyArray[i].getIcon()));
            storycard.add(storyImgPanel[i], ""+i); 
            i++;
        }




        JFrame story = new JFrame("Story");
        story.setSize(500,500);

        storyFramePanel.add(storycard, BorderLayout.CENTER);
        storyFramePanel.add(nextStory, BorderLayout.EAST);
        story.add(storyFramePanel);
        cl3.show(storycard, "1");
        story.setVisible(true);

        }

public static void main(String[] args){

        System.out.println("Application Running");
        JFrame mainframe =  new test();
        mainframe.setTitle("Let Me Know!");
        mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainframe.setSize(1000,1000);
        mainframe.setVisible(true);

    }


class createbuttons implements ActionListener{
          public void actionPerformed(ActionEvent e)
        {

          if(e.getSource() == addtargetbutton){
              count++;
              targetpanel();
              System.out.println("Trying to add another TargetImg, count = "+count); 
          }
          if(e.getSource() == playStory){
                storyFrame(storyLabel);
          }
          if(e.getSource() == nextStory){

          cl3.next(storycard);
          System.out.println("button pressed");
          }
        }
    }

}

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Я понял это:

Во-первых, каждый раз, когда вы вызываете targetpanel(), вы создаете новый экземпляр storyLabel, но затем вы ведете себя так, как будто вы уже заполнили предыдущие вызовы. Итак, результат:

первый звонок:

storyLabel[0] = something;
storyLabel[1] = something;
storyLabel[2] = something;
storyLabel[3] = null;
storyLabel[4] = null.... etc

второй вызов (вы добавили еще один слот изображения):

storyLabel[0] = null;
storyLabel[1] = null;
storyLabel[2] = null;
storyLabel[3] = something;
storyLabel[4] = null.... etc

Поэтому, когда вы используете этот массив в раскадровке, вы получаете NullPointerException. Вам нужно создать массив только один раз. Поэтому удалите storyLabel = new JLabel[20] из targetpanel() и инициализируйте массив в конструкторе или, что еще лучше, в объявлении:

...
    CardLayout cl3;
    JLabel[] storyLabel = new JLabel[20];
    JButton playStory, nextStory, addtargetbutton;
...

Во-вторых, при отображении изображений с использованием storyFrame() вы меняете родителя поставляемых JLabels, и они впоследствии исчезают из storyPanel. Вы должны создать новые экземпляры JLabel для раскадровки.

В storyFrame() вместо

storyImgPanel[i].add(storyArray[i]);

написать

storyImgPanel[i].add(new JLabel(storyArray[i].getIcon()));

Если я все это сделаю, программа работает.

2 голосов
/ 12 марта 2012

В вашем коде недостаточно того, чтобы действительно дать вам хороший ответ. Одна из этих двух строк:

storyImgPanel[i].add(storyArray[i]);
storycard.add(storyImgPanel[i], ""+i); 

было бы моим предположением. Компонент, в который вы добавляете, имеет значение null (storyArray [i] или storyImgPanel [i]. Вероятно, первый, поскольку вы создаете второе в цикле.

Если бы вы могли опубликовать весь свой код, это было бы проще. Или (желательно) опубликовать отдельный небольшой пример.

...