Java 如何在自定义JComponent中正确实现MouseInputListener
我正在尝试对我构建的自定义组件实现一些MouseStener功能。然而,我遇到了一些障碍,让它工作。下面是定制JComponent的代码Java 如何在自定义JComponent中正确实现MouseInputListener,java,swing,mouseevent,Java,Swing,Mouseevent,我正在尝试对我构建的自定义组件实现一些MouseStener功能。然而,我遇到了一些障碍,让它工作。下面是定制JComponent的代码 import javax.swing.ImageIcon; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.event.ChangeListener; import javax.swing.event.MouseInputListener; imp
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.event.ChangeListener;
import javax.swing.event.MouseInputListener;
import org.w3c.dom.events.MouseEvent;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseListener;
import java.lang.reflect.Field;
import java.util.prefs.Preferences;
public class PhotoComponent extends JComponent implements MouseInputListener{
private ImageIcon pic;
Boolean flipped = false;
public PhotoComponent(){
}
public PhotoComponent(ImageIcon p){
pic=p;
}
@Override
public Dimension getPreferredSize(){
if(pic==null){
return new Dimension(0,0);
}
return new Dimension(pic.getIconWidth(), pic.getIconHeight());
}
@Override
protected void paintComponent(Graphics g){
if (flipped==false){
pic.paintIcon(this, g, 0, 0);
}
if (flipped==true){
g.setColor(Color.WHITE);
g.drawRect(0, 0, pic.getIconWidth(), pic.getIconHeight());
g.fillRect(0,0, pic.getIconWidth(), pic.getIconHeight());
}
}
@Override
public void mouseClicked(MouseEvent e){
if(e.getClickCount()==2){
flipped=!flipped;
repaint();
jl.settext("hi");
}
}
@Override
public void mousePressed(MouseEvent e){
//lol
}
@Override
public void mouseReleased(MouseEvent e){
//lol
}
@Override
public void mouseEntered(MouseEvent e){
//lol
}
@Override
public void mouseExited(MouseEvent e){
//lol
}
}
目标是通过双击鼠标在真实图像和全白色图像之间切换。该组件将在下面的代码中使用
public class Base extends JFrame {
private JPanel radio, buttons, tags, container, statusContainer;
private JScrollPane mainScroll;
private JButton next, prev, delete;
private JMenuBar jmb;
private JMenu file, view;
private JMenuItem impo;
private JLabel jl;
private ArrayList<PhotoComponent> picList;
private int pos;
public static void main(String[] args) {
new Base();
}
public Base(){
setTitle("Placeholder");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500,500);
setResizable(true);
menusAndLabels();
pack();
setVisible(true);
}
public void menusAndLabels(){
jmb = new JMenuBar();
setJMenuBar(jmb);
file=new JMenu("File");
statusContainer = new JPanel();
add(statusContainer, BorderLayout.SOUTH);
jmb.add(file);
impo = new JMenuItem("Import");
//currentPic= new PhotoComponent();
picList= new ArrayList<PhotoComponent>(5);
pos = 0;
mainScroll = new JScrollPane();
add(mainScroll);
impo.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent fo){
JFileChooser chooser= new JFileChooser("");
FileFilter filter = new FileNameExtensionFilter("Graphics", "jpg","jpeg","png");
chooser.setFileFilter(filter);
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
chooser.setMultiSelectionEnabled(true);
int response = chooser.showOpenDialog(null);
if(response == JFileChooser.APPROVE_OPTION){
File[] chosen = chooser.getSelectedFiles();
for (File f:chosen) {
if(f.isDirectory()){
File[] temp=f.listFiles();
for (File x:temp){;
ImageIcon ii =new ImageIcon(x.getAbsolutePath());
picList.add(new PhotoComponent(ii));
}
}
else{
ImageIcon ii =new ImageIcon(f.getAbsolutePath());
picList.add(new PhotoComponent(ii));
}
}
mainScroll.setViewportView(picList.get(pos));
///mainScroll.addMouseListener(picList.get(pos));
mainScroll.setVisible(true);
validate();
}
else {
JOptionPane.showInputDialog("oops somethings wrong");
}
}
});
file.add(impo);
}
}
但我不完全确定该怎么办
到目前为止,我的鼠标听者没有回应
在何处向组件添加鼠标侦听器
您需要将侦听器添加到类中,以便它能够响应事件。在构造函数中,您需要以下代码:
addMouseListener( this );
阅读上Swing教程中的部分以获得一个工作示例。我尝试了addMouseListener(这个);但它不断给我语法错误,并告诉我它“需要一个身体”。我的代码错误一直建议我添加:@Override public synchronized void addMouseListener(MouseListener l){//TODO自动生成的方法存根super.addMouseListener(l);}但我不完全确定该怎么办。1)我建议在哪里添加代码2)你是否阅读了工作示例的教程并下载了工作代码以了解如何做到这一点?我阅读了教程并尝试将鼠标侦听器添加到构造函数中,但是我仍然没有在控制台中得到任何输出。1)类名应该以大写字符开头2)您发布的类称为“project”,但main()方法创建了一个“家庭作业”类。3) 您的代码正在使用第三方API。4) PhotoComponent类甚至没有编译一个适当的帖子来演示这个问题。mouseClicked方法需要精确的双击,而不是靠得太近或太远。用鼠标按压进行测试,看看这是否有区别。
addMouseListener( this );