[英]Add JLabel to MouseListener
第一次海報在這里!
我正在使用Java Photo Viewer Gallery 。 我想將所有標簽從ArrayList添加到MouseListener 。 因此,我可以在新的大窗口中打開用戶單擊的圖片。
我有一個文件選擇器,用戶可以在其中選擇i張照片。 我將它們縮放並放入:
縮放的ArrayList = new ArrayList();
錯誤:類型為Component的方法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添加標簽。 您將MouseListener添加到標簽。 您沒有實現MouseListener接口,所以會遇到編譯錯誤。 您需要實現所有方法(mousePressed,mouseReleased ...)。
閱讀Swing教程中有關如何編寫MouseListener的部分,以獲取工作示例。
另外,一旦使MouseListener正常工作,就無需創建兩個標簽。 基本代碼可能類似於:
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
希望對您有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.