【问题标题】:Smaller program to take click input of mouse from multiple JLabel从多个 JLabel 获取鼠标点击输入的较小程序
【发布时间】:2019-06-22 18:01:10
【问题描述】:

我在一个框架中有一堆标签,它们基本上用作显示文本的多行输出。在程序的某些点,用户需要从给定的选项中选择一个选项。他们这样做的方法是点击相应的 JLabel。

我尝试使用 JLabel 数组,但函数不起作用。然后我为每个 JLabel 制作了一个单独的 ActionEvent,它可以工作,但是有没有优雅或高效的代码呢?

【问题讨论】:

    标签: java swing jlabel actionevent


    【解决方案1】:

    不客气。

    你描述了你的问题,我想我可以跟进。

    您可以找出ActionListeners 的相似之处,并将这些相似之处放入super-Class

    对我来说,另一种可能性似乎是“一体式”ActionListener。它的actionPerformed-Method 有一个ActionEvent 类型的参数。这个ActionEvent 提供了一个getSource()- 方法,你可以检索到JComponent 和ActionEvent 发生的时间。所以如果你给你的JLabels命名,你可以检查actionPerformed-Method中的名字

    编辑

    像这样:

    public void actionPerformed(final ActionEvent actionEvent) {
        final String name = ((JComponent) actionEvent.getSource()).getName();
        switch (name) {
            case "label1":
                handleLabel1();
                break;
            case "label2":
                handleLabel2();
                break;
            case "label3":
                handleLabel3();
                break;
            default:
                break;
        }
    }
    

    编辑 1

    import java.awt.AWTEvent;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    
    import javax.swing.BoxLayout;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.SwingUtilities;
    import javax.swing.WindowConstants;
    
    public class Application extends JFrame {
        private abstract class MyComponentListener implements MouseListener, ActionListener {
            protected void actionOnButton(final AWTEvent e) {
                final JButton button = (JButton) e.getSource();
                switch (button.getName()) {
                    case "button1":
                        System.out.println("Hello World");
                        break;
                    default:
                        System.out.println("mouse button one clicked on " + button.getName());
                        break;
                }
                // more general
                this.actionOnComponent(e);
            }
    
            protected void actionOnComponent(final AWTEvent e) {
                final JComponent component = (JComponent) e.getSource();
                final int index = Integer.valueOf(component.getName().replaceAll("[^0-9]", "")).intValue();
                switch (index) {
                    case 1:
                        System.out.println("Hello World");
                        break;
                    default:
                        System.out.println("mouse button one clicked on " + component.getName());
                        break;
                }
            }
    
            protected void actionOnLabel(final AWTEvent e) {
                final JLabel label = (JLabel) e.getSource();
                switch (label.getName()) {
                    case "label1":
                        System.out.println("Hello World");
                        break;
                    default:
                        System.out.println("mouse button one clicked on " + label.getName());
                        break;
                }
                // more general
                this.actionOnComponent(e);
            }
        }
    
        private class MyListener extends MyComponentListener {
            /**
             * {@link ActionListener#actionPerformed(ActionEvent)}
             */
            @Override
            public void actionPerformed(final ActionEvent e) {
                System.out.println("next line(s) generated by ActionListener");
                this.actionOnButton(e);
            }
    
            @Override
            public void mouseClicked(final MouseEvent e) {
                // whole process of mouse button down and up
                if ((e.getButton() == 1)) {
                    System.out.println("next line(s) generated by MouseListener");
                    if ((e.getSource() instanceof JLabel)) {
                        this.actionOnLabel(e);
                    } else if (e.getSource() instanceof JButton) {
                        this.actionOnButton(e);
                    }
                }
            }
    
            @Override
            public void mouseEntered(final MouseEvent e) {
                // on mouse over
            }
    
            @Override
            public void mouseExited(final MouseEvent e) {
                // on mouse out
            }
    
            @Override
            public void mousePressed(final MouseEvent e) {
                // mouse button down
            }
    
            @Override
            public void mouseReleased(final MouseEvent e) {
                // mouse button up after down
            }
        }
    
        private static final long serialVersionUID = 1L;
    
        private Application() {
            super();
        }
    
        public void start() {
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.PAGE_AXIS));
            this.addLabel("Hello World - Label", "label1");
            this.addLabel("Label 2", "label2");
            this.addLabel("Label 3", "label3");
            this.addButton("Hello Word - Button", "button1");
            this.addButton("Button 2", "button2");
            final Dimension dimension = new Dimension(500, 150);
            this.setSize(dimension);
            this.setPreferredSize(dimension);
            this.setVisible(true);
        }
    
        private void addButton(final String text, final String name) {
            final JButton button = new JButton(text);
            button.setName(name);
            button.addMouseListener(new MyListener());
            button.addActionListener(new MyListener());
            this.getContentPane().add(button);
        }
    
        private void addLabel(final String text, final String name) {
            final JLabel label = new JLabel(text);
            label.setName(name);
            label.addMouseListener(new MyListener());
            this.getContentPane().add(label);
        }
    
        public static void main(final String[] args) {
            final Application app = new Application();
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    app.start();
                }
            });
        }
    }
    

    【讨论】:

    • 嘿克里斯!感谢您的回复。所以我调整了代码并用 JLabel 数组替换了所有标签。你能告诉我你的代码将如何相应地改变吗?如果您也可以输入确切的语法,它也会膨胀。你看我不完全是java专家(哎呀,我什至不会称自己为业余爱好者)。比如我在哪里放置mouseAdapter函数和鼠标监听函数???。非常感谢!
    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 2012-12-04
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    相关资源
    最近更新 更多