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

我想到了:

首先,每次调用 时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()));

如果我做所有这些程序正在运行。

于 2012-03-14T13:56:00.417 回答
2

您的代码中没有足够的内容来真正给您一个好的答案。这两行之一:

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

会是我的猜测。您要添加的组件为空(storyArray[i] 或 storyImgPanel[i]。可能是第一个,因为您正在循环中创建第二个。

如果您可以发布所有代码,那就更容易了。或者,(最好)发布一个独立的小例子。

于 2012-03-12T14:24:50.633 回答