第一次海报在这里!
我正在开发一个Java照片查看器库。我想将所有标签从 ArrayList 添加到 MouseListener。所以我可以在一个新的大窗口中打开用户点击的图片。
我有一个文件选择器,用户可以在其中选择我数量的图片。我缩放它们并将它们放在一个:
ArrayListscaled = new ArrayList();
错误:组件类型中的方法 addMouseListener(MouseListener) 不适用于参数 (new ActionListener(){})
我尝试使用
for (int i=0; i< scaled.size(); i++){
panel.add(new JLabel(new ImageIcon (scaled.get(i))));
JLabel l = new JLabel(new ImageIcon(scaled.get(i)));
l.addMouseListener(this); //<- Compiler Error
}
完整的代码是:
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Label;
import java.awt.List;
import java.awt.event.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.*;
public class ImageViewer {
public static void main(String[] args) {
JFrame frame = new ImageViewerFrame();
frame.setTitle("PhotoViewer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
@SuppressWarnings("serial")
class ImageViewerFrame extends JFrame implements MouseListener{
JLabel label;
JFileChooser chooser;
JMenuBar menubar;
JMenu menu;
JMenuItem menuitem;
JPanel panel = new JPanel();
// JLabel l1= new JLabel("First");
// JLabel l2= new JLabel("Second");
// JLabel l3= new JLabel("Third");
// JLabel l4= new JLabel("Fourth");
public ArrayList<File> images = new ArrayList <File>();
public ImageViewerFrame() {
setSize(500,500);
panel.setLayout(new GridLayout(0,5));
label = new JLabel();
add(label);
add(panel);
JButton test = new JButton ("TEST");
test.addMouseListener(this);
panel.add(test);
panel.setVisible(true);
chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
chooser.setMultiSelectionEnabled(true);
menubar = new JMenuBar();
setJMenuBar(menubar);
menu = new JMenu("File");
menubar.add(menu);
menuitem = new JMenuItem("Open");
menu.add(menuitem);
ArrayList<ImageIcon> AL = new ArrayList<ImageIcon>();
ArrayList<Image> scaled = new ArrayList<Image>();
menuitem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event){
int result = chooser.showOpenDialog(null);
if(result == JFileChooser.APPROVE_OPTION) {
//label.setIcon(new ImageIcon(name));
File[] f = chooser.getSelectedFiles();
for(int i=0; i< f.length; i++)
{
images.add(f[i]);
ImageIcon imageicon = new ImageIcon(f[i].toString());
AL.add(imageicon);
}
for (ImageIcon x : AL){
System.out.println(x);
Image image = x.getImage();
Image newimg = image.getScaledInstance(120,120, java.awt.Image.SCALE_SMOOTH);
scaled.add(newimg);
}
for (int i=0; i< scaled.size(); i++){
panel.add(new JLabel(new ImageIcon (scaled.get(i))));
JLabel l = new JLabel(new ImageIcon(scaled.get(i)));
l.addMouseListener(this);
}
}
}
});
}
@Override
public void mouseClicked(MouseEvent arg0) {
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
它不会让我将 JLabel l 添加到 MouseListener
首先,您不要向鼠标侦听器添加标签。将鼠标侦听器添加到标签。您没有实现 MouseListener 接口,因此出现编译错误。您需要实现所有方法(鼠标按下,鼠标释放...)。
阅读 Swing 教程中关于如何编写鼠标侦听器的部分,了解工作示例。
此外,一旦你让鼠标侦听器工作,你就不需要创建两个标签。基本代码可能如下所示:
JLabel l = new JLabel(new ImageIcon(scaled.get(i)));
label.addMouseListener(this); //<- Compiler Error
panel.add( label );
最后,您可能需要考虑使用 JList 来显示图标。它更有效,因为它只是渲染图像。然后,您可以使用 ListSelectionListener 在选择图像时进行处理。有关详细信息,请阅读 Swing 教程中有关如何使用列表的部分。
我会使用一个数组来存储所有鼠标信息。例:
public class MyApp extends JFrame implements MouseListener, MouseWheelListener {
public int[] mouse=new int[5];
public void mousePressed(MouseEvent m) {
if (m.getButton() == m.BUTTON1) {
mouse[2]=1;
}
if (m.getButton() == m.BUTTON2) {
mouse[3]=1;
}
if (m.getButton() == m.BUTTON3) {
mouse[4]=1;
}
}
public void mouseClicked(MouseEvent m) {
if (m.getButton() == m.BUTTON1) {
mouse[2]=3;
}
if (m.getButton() == m.BUTTON2) {
mouse[3]=3;
}
if (m.getButton() == m.BUTTON3) {
mouse[4]=3;
}
}
public void mouseReleased(MouseEvent m) {
if (m.getButton() == m.BUTTON1) {
mouse[2]=2;
}
if (m.getButton() == m.BUTTON2) {
mouse[3]=2;
}
if (m.getButton() == m.BUTTON3) {
mouse[4]=2;
}
}
public void mouseEntered(MouseEvent m) {
}
public void mouseExited(MouseEvent m) {
}
public void mouseWheelMoved(MouseWheelEvent w) {
mouse[3]=w.getWheelRotation();
}
public MyApp() {
super("MyApp");
//Do your stuff here...
//...
//...
setTitle("Image Picker");
requestFocus();
addMouseListener(this);
addMouseWheelListener(this);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(1400,1000);
setResizable(true);
setVisible(true);
int gc=0;
Rectangle r;
while (true){
try {
Thread.sleep(33);
} catch(InterruptedException bug) {
Thread.currentThread().interrupt();
System.out.println(bug);
}
r=getComponents()[0].getBounds();
gc=gc+1;
if (gc==500) {
System.gc();
gc=0;
}
mouse[0]=MouseInfo.getPointerInfo().getLocation().x-getComponents()[0].getLocationOnScreen().x;
mouse[1]=MouseInfo.getPointerInfo().getLocation().y-getComponents()[0].getLocationOnScreen().y;
//Display labels
}
}
public static void main(String args[]){
new MyApp();
}
}
mouse
数组将是:
mouse[0] - mouse x pos
mouse[1] - mouse y pos
mouse[2] - left mouse button
mouse[3] - middle mouse button
mouse[4] - right mouse button
mouse[5] - mouse wheel rotation, 0 if none, else -n to n
并且应该很容易检查一个点(鼠标)是否在矩形(标签)上。如果您不知道如何获取标签的位置,只需使用此代码:
Rectangle r=getComponents()[1+n].getBounds();
//r.x, r.y, r.width, r.height
希望对您有所帮助!