0

ImageIconの配列があり、他のアイコンをドラッグアンドドロップして置き換えることができます。ボタンを押すと、ImageIconsの配列から新しいJFrameが作成されます。

他のアイコンを元の配列にドラッグせずにこれを行うと、機能します。ただし、別のイメージアイコンを配列にドロップすると、ボタンを押すとエラーが発生します。

これが可能かどうか疑問に思っていますか?

トップパネルに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");
          }
        }
    }

}
4

2 に答える 2

2

あなたのコードには本当に良い答えを与えるのに十分ではありません。これらの2行のいずれか:

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

私の推測だろう。追加するコンポーネントはnullです(storyArray[i]またはstoryImgPanel[i]のいずれかです。ループ内で2番目を作成しているため、おそらく最初のコンポーネントです。

すべてのコードを投稿できれば、もっと簡単になります。または、(できれば)自己完結型の小さな例を投稿してください。

于 2012-03-12T14:24:50.633 に答える
2

私はそれを考え出した:

まず、を呼び出すたびにtargetpanel()、の新しいインスタンスを作成しますがstoryLabel、その後は、前の呼び出しからすでに入力されているように動作します。したがって、結果は次のようになります。

最初の呼び出し:

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

2回目の呼び出し(別の画像スロットを追加しました):

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

したがって、ストーリーボードでこの配列を使用すると、NullPointerExceptionが発生します。アレイを作成する必要があるのは1回だけです。したがって、コンストラクターで配列を削除storyLabel = new JLabel[20]targetpanel()て初期化します。宣言ではさらに適切です。

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

次に、を使用して画像を表示する場合storyFrame()、提供されたJLabelの親を変更すると、その後、画像はから消えstoryPanelます。ストーリーボード用にJLabelの新しいインスタンスを作成する必要があります。

storyFrame()、代わりに

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

書きます

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

私がこれをすべて行うと、プログラムは機能しています。

于 2012-03-14T13:56:00.417 に答える