单击JPanel数组时显示图像

时间:2016-08-19 09:17:04

标签: java jpanel

我写了两种方式来显示图像,当时一个JPanel阵列,但它没有显示图像。

这是我的代码:

public class Mutil_Image_2 implements MouseListener {   

    public JPanel [][]sub=new JPanel[10][10];
    public JPanel screen = new JPanel();

    public JFrame f = new JFrame("Draw on Panel");
    public static int v1,v2; 
    public static int x1 =1,y1=1;

    public Mutil_Image_2(String title)
    {

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setExtendedState(JFrame.MAXIMIZED_BOTH); //Full Screen

        screen.setBorder(BorderFactory.createLineBorder(Color.black));
        screen.setLayout(new GridLayout(10,10));    

        int dem =0;
        for (int i=0; i<=9;i++)
        {
            for (int j=0; j<=9;j++)
            {                   
                sub[i][j]= new JPanel();
                sub[i][j].setBorder(BorderFactory.createLineBorder(Color.red));             
                screen.add(sub[i][j]);

                v1=i;
                v2=j;               
                sub[i][j].addMouseListener(this);
                f.add(screen);
            }

        }
        f.pack();
        f.setVisible(true); 
    }
    public static void main(String args[])
    {
        new Mutil_Image_2("Grid Layout");    
    }

    public void mouseClicked(MouseEvent e) {

    }
    public void mouseEntered(MouseEvent e) {
    }   
    public void mouseExited(MouseEvent e) { 
    }
    public void mouseReleased(MouseEvent e) {       
    }

    public void mousePressed(MouseEvent e) {
        JPanel source = (JPanel) e.getSource();     
        BufferedImage img1;

        if(e.getButton() == MouseEvent.BUTTON1)    
        {                       
            x1=e.getX();
            y1=e.getY();
            //source.setBackground(Color.black);
            source.setSize(500, 500);

            try { // The first way to show Image
                img1 =  ImageIO.read(new File("D:\\Pict3.png"));
                JLabel picLabel = new JLabel (new ImageIcon(img1));
                source.add(picLabel);
            } catch (IOException e1) {
                e1.printStackTrace();
            }   

            source.add(new draw_Image_in_MultiPanel()); //Second way to show Image          
        }   
    }
}

class draw_Image_in_MultiPanel extends JPanel {

    Image img1,img2;

    public draw_Image_in_MultiPanel() {         
        setBorder(BorderFactory.createLineBorder(Color.black));   
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setSize(screenSize.width, screenSize.height);
    }  

    public void paint(Graphics g) {
        super.paintComponent(g);
        int vt1 = Mutil_Image_2.x1;
        int vt2 = Mutil_Image_2.y1;

        try 
        {   
                img1 =  ImageIO.read(new File("D:\\Pict3.jpg"));                    
                g.drawImage(img1, vt1, vt2, img1.getWidth(this),img1.getHeight(this) , Color.darkGray, this);
                g.drawString("Postion is:" + vt1 + " -" + vt2, vt1,vt2);


        } catch (IOException e) {           
            e.printStackTrace();
        }           
    }  }

1 个答案:

答案 0 :(得分:0)

首先尝试这个:

    source.add(picLabel);
    //Followed by
    source.revalidate();

第二种方式:

    source.add(new draw_Image_in_MultiPanel());
    //Again followed by
    source.revalidate();

一般来说,在将JFrame设置为可见后添加或更改组件时,应调用&#34; revalidate()&#34;在容器上。这告诉Java更新UI布局。我很确定这是你的问题。

<强> 修改

在玩完你的代码之后,在我看来,调整JPanels的大小和编辑会让你很头疼。相反,我提出了一个使用JDialog在单击面板时显示图像的示例。 JDialog充当可以在任何地方绘制的面板,它将始终位于其他面板之上。这也意味着您的所有面板都可以保持相同的尺寸。当用户点击其他地方时,它还简化了关闭面板的过程。 您的所有代码都是相同的(减去我删除的内部类)我对您的代码所做的任何编辑或删除都被注释掉了,这样您就可以看到我更改的内容和原因。

public class Mutil_Image_2 implements MouseListener {


//A JDialog to show your image
public JDialog popup;
//A JPanel to store the last panel that was clicked.
public JPanel lastPane;

public JPanel[][] sub = new JPanel[10][10];
public JPanel screen = new JPanel();

public JFrame f = new JFrame("Draw on Panel");
public static int v1, v2;
public static int x1 = 1, y1 = 1;

public Mutil_Image_2(String title) {
    //Popup that is owned by your JFrame f.
    popup = new JDialog(f);
    //Initial location
    popup.setLocation(0, 0);
    //Initial size same as source in your original code.
    popup.setSize(500, 500);
    //Removes the window controls from the popup to make it look like a JPanel
    //Setting this to false will make the popup look like a JFrame.
    popup.setUndecorated(true);


    //Your original code for drawing all the JPanels
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setExtendedState(JFrame.MAXIMIZED_BOTH); // Full Screen

    screen.setBorder(BorderFactory.createLineBorder(Color.black));
    screen.setLayout(new GridLayout(10, 10));

    int dem = 0;
    for (int i = 0; i <= 9; i++) {
        for (int j = 0; j <= 9; j++) {
            sub[i][j] = new JPanel();
            sub[i][j].setBorder(BorderFactory.createLineBorder(Color.red));
            screen.add(sub[i][j]);

            v1 = i;
            v2 = j;
            sub[i][j].addMouseListener(this);
            f.add(screen);
        }

    }
    f.pack();
    f.setVisible(true);
}

public static void main(String args[]) {
    new Mutil_Image_2("Grid Layout");
}

public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}

public void mousePressed(MouseEvent e) {
    JPanel source = (JPanel) e.getSource();
    BufferedImage img1;



    if (e.getButton() == MouseEvent.BUTTON1) {

        //Close the popup if the same panel was clicked twice
        if(lastPane != null){
            if(lastPane.equals(source)){
                popup.setVisible(false);
                lastPane = null;
                return;
            }
        }
        //If the above test was false we are clicking a different panel
        //assign this panel to lastPane so we can close the popup if
        //this pane is clicked again
        lastPane = source;

        //We now get the position of the click in the frames coordinates
        //Using e.getX/Y will return the click in panel coordinates, we don't want
        //that as we are positioning the popup relative to the JFrame.
        x1 = f.getMousePosition().x;
        y1 = f.getMousePosition().y;

        //Position the popup on the mouse click
        popup.setLocation(x1, y1);

        //Old code
        //x1 = e.getX();
        //y1 = e.getY();
        // source.setBackground(Color.black);
        //source.setSize(500, 500);

        try { // The first way to show Image
            img1 = ImageIO.read(new File("D:\\Pict3.png"));
            JLabel picLabel = new JLabel(new ImageIcon(img1));

            //Remove any components in the popups content pane
            //this essemntially gives up a fresh panel inside
            //the popup.
            popup.getContentPane().removeAll();
            //add picture to popup
            popup.add(picLabel);
            //show popup
            popup.setVisible(true);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

}

尝试一下,我相信这是你正在寻找的,也是我能想到的最简单的方法。

回答您关于定位图片的其他问题: 您可以在弹出窗口的内容窗格中使用布局管理器,也可以将弹出窗口的布局管理器设置为null并在JLabel上使用set position。

如果您有任何其他问题,请不要犹豫,问:)