【问题标题】:Catch action events from a JPanel component in a JFrame parent window在 JFrame 父窗口中捕获来自 JPanel 组件的操作事件
【发布时间】:2013-05-18 17:29:33
【问题描述】:

如何在 Java Swing 的 JFrame 父窗口中捕获来自 JPanel 组件的动作事件?

我很难尝试在 Swing 中制作自定义组件。

我的想法是在 Swing 中创建一个自定义 JPanel,其中包含一些 JButton,并在 JFrame 父窗口中通过这些按钮捕获动作事件。

我想在我的自定义 JPanel 中实现 addActionListener() 方法,就好像它是一个按钮一样。

我是否必须从JComponent 扩展而不是JPanel

非常感谢您的帮助和您的时间。

package pizzeria.interfaz;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;

public class AplicacionCliente extends JFrame{

    public AplicacionCliente() {

        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());

        PanelMenu panelmenu = new PanelMenu(); //PanelMenu extends JPanel and has my buttons


        JButton bot = new JButton("Prueba");        
        bot.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("Botonazo!");

            }}); 


        contentPane.add(bot);
        contentPane.add(panelmenu, BorderLayout.LINE_END);

    }
}

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 不要扩展框架或其他顶级容器。而是创建和使用一个实例。

标签: java swing jpanel custom-component actionevent


【解决方案1】:

为什么要实现addActionListener 而不是addMouseListener

¿Por qué quieres implementar addActionListener en vez de addMouseListener?

编辑:检查此代码,可能有效

public class AplicacionCliente extends JFrame implements MouseListener{

public AplicacionCliente() {

    Container contentPane = getContentPane();
    contentPane.setLayout(new BorderLayout());
    this.setVisible(true);

    PanelMenu panelmenu = new PanelMenu(); //PanelMenu extends JPanel and has my buttons


    JButton bot = new JButton("Prueba");
    bot.addMouseListener(this);
    bot.setName("bot");

    contentPane.add(bot);
    contentPane.add(panelmenu, BorderLayout.LINE_END);

}

@Override
public void mouseClicked(MouseEvent e) {
}

@Override
public void mousePressed(MouseEvent e) {
    if(((JButton)e.getSource()).getName().compareToIgnoreCase("bot")==0){
        System.out.println("Botonazo!!");
    }
}

@Override
public void mouseReleased(MouseEvent e) {
}

@Override
public void mouseEntered(MouseEvent e) {
}

@Override
public void mouseExited(MouseEvent e) {
}

【讨论】:

  • 嗨,scgr,让我试试。所以我可以获取按下的按钮名称或标签,并为按钮的行为添加一些代码,对吗?
  • 是的,您可以使用bot.setName("name") 设置按钮的名称,然后使用事件中的getName() 检查按钮是否按下了您想要的按钮
  • 是的,但我无法从父窗口中捕捉到单击的按钮。
  • 使用最后的代码,您可以区分面板上所有可能的按钮并管理此按钮的不同行为
  • 有些奇怪,但实现 MouseListener 不起作用,因为我无法检测到何时单击按钮。我会继续检查它。不过,我真的很感谢你对 scgr 的帮助。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2010-11-25
  • 2018-09-02
相关资源
最近更新 更多