在点击时创建的JPanel没有出现

时间:2014-08-22 00:26:30

标签: java swing

以下代码不是我的实际代码,而是我想要实现的简洁,可运行的重制。我希望JPanel CP clickPanel的实例在用户点击JPanel hasAnImage中的图片时显示。我可以在Netbeans控制台中看到由于Sys.out.print而正在执行,但屏幕上没有任何内容。我已尝试将可见设置为false,然后再次设置为true,并在revalidate()事件中设置mousePressed;图像向左移动,但屏幕上没有任何内容。目标是CP出现。我错过了什么?希望我的问题很明确。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Testo extends JFrame{

    public Testo(){ 

        BufferedImage image = null;
        try {
            image = ImageIO.read(new File("C:\\Users\\someimage.jpg"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
;
        final JLabel label = new JLabel(new ImageIcon(image));
        JPanel hasAnImage = new JPanel();
        hasAnImage.addMouseListener(new MouseAdapter(){
            @Override //I override only one method for presentation
            public void mousePressed(MouseEvent e) {
                clickPanel CP = new clickPanel();
                hasAnImage.add(CP);
                revalidate();
                //setVisible(false);
                //setVisible(true);
            }
        });
        hasAnImage.add(label);
        add(hasAnImage);
        setVisible(true);
    }

    public static void main(String[] args) {

        Testo frame = new Testo(); 
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.getContentPane().setBackground(Color.WHITE);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public class clickPanel extends JPanel{

        public clickPanel() {
            setPreferredSize(new Dimension(100,60));
            setMaximumSize(new Dimension(100,60));
            setBackground(new Color(1.0f,1.0f,1.0f,0.1f));
            setBorder(BorderFactory.createMatteBorder(2,2,2,2,Color.GREEN));
            System.out.println("This is being executed...");
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setFont(new Font("Arial", Font.PLAIN, 12));
            g.setColor(Color.GREEN);
            g.drawString("CLICK", 2, 2);
        }
    } 
}

1 个答案:

答案 0 :(得分:1)

revalidate();窗格外,您还需要repaint();它。因此,您的mousePressed方法应该成为:

public void mousePressed(MouseEvent e) {
      clickPanel CP = new clickPanel();
      hasAnImage.add(CP);
      revalidate();
      repaint();
}

进一步阅读:http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html#repaint()