组件本身可以用作侦听器吗? - java

我尝试在Java中使用此代码,在Java中我使用了JFrame作为它自己的ActionListener。现在,从理论上讲是可行的,因为在Java中,一个类既可以实现许多接口,又可以扩展另一个类。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;

/*
 * This is an example of the strangeness of the syntax of Java. In this example, I am using the JFrame itself as the listener for its component, namely a JButton which, on clicking, ends the program. 
 * Warning : This is just an example, and I would never recommend this syntax, for I do not know the full consequences yet.
 */

@SuppressWarnings("serial") public class ListenerTest extends JFrame implements ActionListener{

    private final JPanel contentPane;
    private final JLabel message;
    private final JButton button;

    /**
     * Launch the application.
     */
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable(){
            @Override public void run(){
                try{
                    ListenerTest frame = new ListenerTest();
                    frame.setVisible(true);
                } catch(Exception e){
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public ListenerTest(){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 200, 150);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new BorderLayout(0, 0));

        message = new JLabel("Hello World");
        message.setFont(new Font("Times New Roman", Font.PLAIN, 16));
        message.setHorizontalAlignment(SwingConstants.CENTER);
        contentPane.add(message, BorderLayout.CENTER);

        button = new JButton("Click Me!");
        button.addActionListener(this);
        contentPane.add(button, BorderLayout.SOUTH);
    }

    @Override public void actionPerformed(ActionEvent arg0){
        JOptionPane.showMessageDialog(null, "Well, I listened for myself!");
        System.exit(0);
    }

}

我的问题是:将组件用作自己的侦听器是否有问题?

参考方案

它有效吗...是的。

话虽如此。我可以举数百个不良编码实践的例子,这就是其中之一。

几乎不需要在Swing中扩展Jxxx类(也许自定义绘画除外)。在您的示例中,您可以使用JFrame而不是扩展它
拥有实现ActionListener接口的类,可以向您的API /代码的用户建议将其用作ActionListener。但是,您的课程并未设计为ActionListener。它是一个事实是可以更好地隐藏的实现细节。因此,请使用ActionListener(匿名类,内部类...),而不是直接实现它(甚至更好的是使用Action

不,直接实现ActionListener接口与我无关,我看到GUI加载了很长时间

并作为旁注。最好使用JFrame#pack(),然后再调用setBounds

Java Swing SearchBox模型 - java

我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。

Swing-典型桌面应用程序中的并发 - java

这可能是一个广泛的问题,但我想知道单用户桌面应用程序通常在何处使用并发。您如何发现理想情况下(在设计阶段)并发问题?附注:从操作系统理论上来说,并发问题通常发生在无法共享资源(例如打印机)的情况下。不过,我仍然对在编程级别上可能发生的情况感到迷惑。 java大神给出的解决方案 Event Dispatch thread与其他逻辑之间的Swing中可能存在线程…

如何使用BorderLayout(Java)扩展JTextField - java

我有一个Java程序,其中使用的是JTextField,但如果我未指定默认大小,则其宽度为0。我将其插入BorderLayout中,因此如何制作它展开以填充整个容器? java大神给出的解决方案 在上面的示例中,文本字段将正常工作。但是,如果您插入EAST或WEST,则将不起作用。import java.awt.BorderLayout; import ja…

Java-如何使Jtextfield充满整个框架 - java

我正在尝试使JTextArea填充整个框架,因此它看起来有点像记事本或textedit。也可以有一个滚动窗格。提前致谢!编辑:JTextArea 参考方案 试试这个 - -import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JTextField; public…

用不同的颜色在jTextArea上附加错误消息 - java

我想知道是否有一种方法可以在jTextArea中使用不同的字体颜色附加错误消息。这样,它将使我要附加的正常输出与错误输出之间有所不同。例如,在Netbeans上,system.err字体颜色为红色,而System.out则显示为黑色。 java参考方案 JTextArea仅允许使用一种颜色。您可以改用JTextPane