Gridlayout,对同一个mouseevent上的每个单元格的不同操作

时间:2014-04-28 09:29:28

标签: java mouseevent cells

我有一个填充了从File加载的图像的Gridlayout,我想在每个图像的mouseEvent mouseClicked上添加一个不同的,例如popup。如何确定我点击的图片?我已经尝试添加GetComponentAt(Point),但是Eclipse一直在显示它作为mouseAdapter的未识别方法,我如何确定if语句的字段?

这就是我所拥有的:

public class testclass implements ItemListener  {

JPanel template;
final static String title = "Title";

public void testclass (Container window){

    JPanel index = new JPanel();

    String index2[] = {title};
    JComboBox index3 = new JComboBox(index2);
    index3.setEditable(false);
    index3.addItemListener(this);
    index.add(index3);

     File folder = new File("images/");
        File[] listOfFiles = folder.listFiles();

        String nr;
        final JPanel panel = new JPanel(new GridLayout(4, 4, 4, 4));

        for (int i = 0; i < listOfFiles.length; i++) {
                nr = "images/" + listOfFiles[i].getName();
                final ImageIcon images = new ImageIcon(nr);
                final JLabel display[] = new JLabel[1];

            for (int n = 0; n < 1; n++){
                display[n] = new JLabel(images);
                panel.add(display[n]);  
         } }
            panel.addMouseListener(new MouseAdapter()

            { public void mouseClicked (MouseEvent e)
            {   //JPanel panel = (JPanel) getComponentAt(e.getPoint());
                JOptionPane.showMessageDialog(null, "Message");
            }}); 


    template = new JPanel(new CardLayout());
    template.add(panel, title);

    window.add(index, BorderLayout.PAGE_START);
    window.add(template, BorderLayout.CENTER);
}
public void itemStateChanged(ItemEvent event){

    CardLayout change = (CardLayout)(template.getLayout());
    change.show(template, (String)event.getItem());
}

private static void userinterface() {

    JFrame showwindow = new JFrame("Window");
    showwindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    testclass show = new testclass();
    show.testclass(showwindow.getContentPane());

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

public static void main(String[] args) {
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
          } catch(Exception e){
          }
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            userinterface();
        }
    });
}

}

1 个答案:

答案 0 :(得分:0)

编辑:正确答案

谢谢你提供代码。我调整了一些东西,希望你能理解它们。

  • 首先,我添加了一个新对象ImageButton。从我添加actionListener时,你想要的功能已经完成(减去好看,你将不得不玩这个,或者问另一个问题)
  • 添加了一个&#39; dir&#39;字符串,以便您不必复制和粘贴目录地址。
  • 我必须通过userInterface()方法调整窗口的大小,你应该看看是否能够缩短能够调整参数的顺序,也许是另一个GUI对象来保存所有这些信息。

有几件事:

你写的代码很好,但你需要调整很多(获得窗口的大小,如果你调整了窗口大小,鼠标点击可以点击其他你不喜欢的图像,反复检查不同大小) 39; t want!)为了让mouseListener工作,我猜你会提供各种各样的图片。

在您的代码中添加注释可以帮助您和想要帮助您的人。

无论如何,请提出/接受答案,如果这有所帮助,我确信这样做。

祝你好运!


将这些文件放入eclipse并运行它们,如果您调整dir字符串以遵循原始目录路径,它应该可以正常工作。

testclass.java

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

public class testclass implements ItemListener {

JPanel template;
final static String title = "Title";
final String dir = "images/";

public void testclass(Container window) {

    JPanel index = new JPanel();

    String[] index2 = { title };
    JComboBox index3 = new JComboBox(index2);
    index3.setEditable(false);
    index3.addItemListener(this);
    index.add(index3);
    index.setSize(500, 500);

    File folder = new File(dir);
    File[] listOfFiles = folder.listFiles();

    String nr;
    final JPanel panel = new JPanel(new GridLayout(4, 4, 4, 4));

    for (int i = 0; i < listOfFiles.length; i++) {
        nr = dir + listOfFiles[i].getName();

        panel.add(new ImageButton(nr));

    }

    template = new JPanel(new CardLayout());
    template.add(panel, title);

    window.add(template, BorderLayout.CENTER);
    window.add(index, BorderLayout.NORTH);

    window.setVisible(true);
}

public void itemStateChanged(ItemEvent event) {

    CardLayout change = (CardLayout) (template.getLayout());
    change.show(template, (String) event.getItem());
}

private static void userinterface() {

    JFrame showwindow = new JFrame("Window");
    showwindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    testclass show = new testclass();
    show.testclass(showwindow.getContentPane());

    showwindow.pack();
    showwindow.setVisible(true);
    showwindow.setSize(500, 500);
}

public static void main(String[] args) {
    try {
        UIManager
                .setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    } catch (Exception e) {
    }
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            userinterface();
        }
    });
}
}

ImageButton.java

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;

public class ImageButton extends JButton {

private String fileName;
private ImageIcon image;
private JButton button;

public ImageButton(String fileName) {

    setFileName(fileName);
    setImage(new ImageIcon(fileName));
    setButton(new JButton(getImage()));

    this.setIcon(getImage());

    this.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent ae) {

            JOptionPane.showMessageDialog(null, ae.getSource());
        }
    });

}

public String getFileName() {
    return fileName;
}

public void setFileName(String fileName) {
    this.fileName = fileName;
}

public ImageIcon getImage() {
    return image;
}

public void setImage(ImageIcon image) {
    this.image = image;
}

public JButton getButton() {
    return button;
}

public void setButton(JButton button) {
    this.button = button;
}

}