【问题标题】:How can i print the button name that trigger the event?如何打印触发事件的按钮名称?
【发布时间】:2018-09-21 13:38:29
【问题描述】:

我已经制作了这个程序,我想在单击某个按钮时打印一条消息和按钮的名称。但它不会打印任何东西,也不会出错。

public class Example {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setTitle("Hello");
        frame.setSize(400, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        frame.setLayout(new BorderLayout());

        JPanel buttonsPanel = new JPanel();
        buttonsPanel.setLayout(new GridLayout(2, 2));

        JTextArea txtArea = new JTextArea();
        HelloActionListener listen = new HelloActionListener(txtArea);
        JButton b1 = new JButton("TOP");
        b1.addActionListener(listen);
        JButton b2 = new JButton("LEFT");
        JButton b3 = new JButton("RIGHT");
        JButton b4 = new JButton("BOTTOM");
        b4.addActionListener(listen);
    }
}

还有班级HelloActionListener

public class HelloActionListener implements ActionListener {

    public JTextArea area;

    public HelloActionListener(JTextArea area) {
        this.area = area;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        JButton x = (JButton) e.getSource();
        area.setText("Hello Folks" + x.getText());
    }
}

有人知道我的错误在哪里吗?

【问题讨论】:

    标签: java swing actionlistener jtextfield


    【解决方案1】:

    我看到三个主要问题。第一个是您没有将Buttons 添加到您创建的Jpanel (buttonsPanel),也没有将buttonsPanel 添加到您的frame,您也没有将txtArea 添加到frame。其次,您的操作顺序已关闭。我建议您在完成框架构建后致电frame.setVisible(true)。第三个问题是您在JFrame 上使用BorderLayout,这不是一个很好的布局(在我看来)。您的监听器和其他代码看起来都很好。

    将您的代码更改为此似乎可以使其按需要运行:

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setTitle("Hello");
        frame.setSize(400, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridLayout(2,1));
    
        JPanel buttonsPanel = new JPanel();
        buttonsPanel.setLayout(new GridLayout(2, 2));
    
        JTextArea txtArea = new JTextArea("Place Holder");
        txtArea.setColumns(2);
        HelloActionListener listen = new HelloActionListener(txtArea);
        JButton b1 = new JButton("TOP");
        b1.addActionListener(listen);
        buttonsPanel.add(b1);
        JButton b2 = new JButton("LEFT");
        buttonsPanel.add(b2);
        JButton b3 = new JButton("RIGHT");
        buttonsPanel.add(b3);
        JButton b4 = new JButton("BOTTOM");
        b4.addActionListener(listen);
        buttonsPanel.add(b4);
    
        frame.add(txtArea);
        frame.add(buttonsPanel);
    
        frame.setVisible(true);
    }
    

    我建议阅读this guide 以了解 Java 中的布局管理器。即使它在这里工作,这也不是一个很好的布局方式。

    【讨论】:

    • which is just not a very good layout to work with - BorderLayout 对于大多数框架来说是一个很好的说明点。通常,您会将“工具栏”面板添加到“NORTH”,将“状态”面板添加到“SOUTH”(如果需要)。在“中心”中,您可以使用适当的布局管理器将主要应用程序组件添加到另一个面板。这个区域的大小随着框架的变化而变化。我不明白为什么你会为buttonsPanel 和textarea 使用GridLayout。为什么两者的大小会一样?通常,按钮面板是固定的,文本区域会扩大/缩小。
    • @camickr - 正如你所说,这是一个很好的起点。但是,对于完整的 Java 应用程序,我倾向于回避BorderLayout。我更喜欢使用基于网格的布局,因为它们可以让您更好地控制项目的定位(尽管我在这里并没有真正使用它——我只是想为 OP 的主要问题设计一个解决方案)。
    • 即使在一个完整的应用程序中,BorderLayout 也是一个合理的起点。因为你有一个逻辑上的高级组件。查看您拥有的大多数应用程序 1) 菜单栏 2) 工具栏 3) 应用程序区域 4) 状态栏。因此,您使用 BorderLayout 的区域进行高级细分。然后,您将“基于网格的布局”用于 CENTER 面板及其独特的要求。
    • 感谢您的宝贵时间!根据您的建议,我修复了它。
    【解决方案2】:

    您忘记将txtArea 添加到您的框架中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 2016-10-01
      • 1970-01-01
      • 2021-06-02
      • 2018-01-10
      相关资源
      最近更新 更多