【问题标题】:Nothing happens when button is clicked单击按钮时没有任何反应
【发布时间】:2013-05-04 01:38:52
【问题描述】:

我正在使用 JTabbedPane 用 Ja​​va 编写程序。每个选项卡都与带有标签、文本字段和按钮的不同面板相关联。我在面板中使用了 GridBagLayout。 我在按钮上添加了一个动作监听器,但是当我点击它时没有任何反应。 编辑:我在 JTabbedPane 之外还有其他按钮可以正常工作。

我可以看到没有发生任何事情,因为我这样做了:

public void actionPerformed( ActionEvent e ) { 
    if ( e.getSource() == button ) { 
        System.out.println("blablabla");
    }

什么都没有打印出来。

使用按钮和 GridBagLayout/JTabbedPane 有什么常见问题吗?

使用 SSCCE 编辑

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;

public class Hjelp extends JFrame { 
    private FlowLayout layout;
    private JButton button1; 
    private JButton button2;
    private JPanel menu, frontpage; 
    private JPanel present, previous, something;

    public Hjelp() {
        layout = new FlowLayout(FlowLayout.CENTER, 10, 20); 
        setLayout(layout);
        setSize(900, 900); 
        setLocationRelativeTo(null); 
        setVisible(true);
        setPanels();
        something = something();
        add(something, BorderLayout.CENTER);
        something.setVisible(false);
        button1 = new JButton("CLICK ME"); 
        add(button1);
        buttonListener();
    }

    private void buttonListener() {
        Buttonlistener listener = new Buttonlistener();
        button1.addActionListener(listener);
        button2.addActionListener(listener);

    }

    private void setPanels() {
        menu = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 0));
        frontpage = new JPanel();
        previous = frontpage;
        present = frontpage;
        add(menu);
    }

    public void visiblePanel() { 
        previous.setVisible(false);
        present.setVisible(true);
    }

    private JPanel something() {
        visiblePanel();
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(1, 1));
        JTabbedPane tabbedPane = new JTabbedPane();

        JComponent panel1 = tab();
        tabbedPane.addTab("Click me", panel1);
        tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);

        tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);

        panel.add(tabbedPane);

        return panel;
    }

    private JComponent tab() {
        JPanel panel = new JPanel(false);
        panel.setPreferredSize(new Dimension(870, 300));
        panel.setLayout(new GridBagLayout());
        GridBagConstraints cs = new GridBagConstraints();
        cs.fill = GridBagConstraints.HORIZONTAL;
        button2 = new JButton("Click me");
        cs.gridx = 1;
        cs.gridy = 6;
        cs.gridwidth = 1;
        panel.add(button2, cs);
        return panel;
  }

        private class Buttonlistener implements ActionListener { 
        @Override
        public void actionPerformed( ActionEvent e ) { 
            if ( e.getSource() == button1 ) { 
                    present = something; 
                    button1.setVisible(false);
                    something();
                    previous = something;
                }
                else if (e.getSource() == button2) {
                    System.out.println("Blablabla");
                }

        }
    }



    public static void main(String [] args) { 
        final Hjelp vindu = new Hjelp();
        vindu.addWindowListener(
                        new WindowAdapter() {
                            @Override
                            public void windowClosing(WindowEvent e) {
                                System.exit(0);
                            }
                        } );
    }

}

已解决

Solution

【问题讨论】:

  • 按钮、布局或选项卡式窗格有问题?不,自 1999 年的 1.0/1.1 以来,它们一直是 Java 的一部分。这是你和你的代码。您可能没有将 Listener 类添加到按钮。
  • 如需尽快获得更好的帮助,请发帖SSCCE
  • @Vulcan == 有什么问题?这是一个身份比较。
  • @duffymo 实际上我确实将侦听器类添加到按钮。
  • “其实我做到了..” 让 SSCCE 说话,然后一切都“一清二楚”。

标签: java swing awt jbutton actionlistener


【解决方案1】:

你根本不需要getSource 检查——你的监听器(希望)只附加到一个按钮上,所以如果它被调用,那已经意味着该按钮被点击了。删除检查并无条件打印您的字符串。如果你还是什么都没看到,那么你有问题。

【讨论】:

  • 其实,我的监听器并不仅仅依附于一个按钮。如果我的代码具有误导性,我很抱歉。请参阅我的编辑。不过,感谢您的宝贵时间!
  • 那么为什么不每次触发监听器时打印一些东西呢? getSource,根据我的经验,不是一个非常可靠的机制。你最好坚持其他人都在做的事情,即使用匿名类,每个类都专用于自己的按钮。
【解决方案2】:

您可能没有将处理程序附加到实际按钮,因此该事件将永远不会被调用。

第 1 部分:

        ButtonHandler handler = new ButtonHandler();
        button.addActionListener( handler );

第 2 部分:

public class ButtonHandler implements ActionListener 
   {
        @Override
        public void actionPerformed(ActionEvent event) {    

        }
   }

ALSO:Java GUI 可能很挑剔,而不是使用“e.getSource() == button”,您可以尝试“button..isFocusOwner()”

【讨论】:

  • 我已将处理程序附加到按钮。在这里查看我的代码link
  • @Camilla 是的,我相信你做到了(奇怪的做法)所以尝试将“e.getSource() == button”更改为“button1.isFocusOwner()”,看看会发生什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多