Java 单击按钮时不会发生任何事情
我正在用Java编写一个程序,其中使用了JTabbedPane。每个选项卡都与带有标签、文本字段和按钮的不同面板相关联。我在面板中使用了GridBagLayout。 我已经在按钮中添加了一个actionlistener,但是当我单击它时,什么也没有发生。 编辑:我在JTabbedPane外还有其他按钮,效果非常好 我可以看到什么都没有发生,因为我这样做:Java 单击按钮时不会发生任何事情,java,swing,awt,jbutton,actionlistener,Java,Swing,Awt,Jbutton,Actionlistener,我正在用Java编写一个程序,其中使用了JTabbedPane。每个选项卡都与带有标签、文本字段和按钮的不同面板相关联。我在面板中使用了GridBagLayout。 我已经在按钮中添加了一个actionlistener,但是当我单击它时,什么也没有发生。 编辑:我在JTabbedPane外还有其他按钮,效果非常好 我可以看到什么都没有发生,因为我这样做: public void actionPerformed( ActionEvent e ) { if ( e.getSource()
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);
}
} );
}
}
已解决
您根本不需要
getSource
检查,您的侦听器(希望)只连接到一个按钮,因此如果它被调用,就意味着该按钮已被单击。删除复选框并无条件打印字符串。如果您仍然没有看到任何内容,那么您就有问题了。您根本不需要检查getSource
您的侦听器(希望)只连接到一个按钮,因此如果调用了它,就意味着该按钮已被单击。删除复选框并无条件打印字符串。如果您仍然没有看到任何内容,那么您就有问题。您可能没有将处理程序附加到实际按钮,因此事件将永远不会被调用
第1部分:
ButtonHandler handler = new ButtonHandler();
button.addActionListener( handler );
public class ButtonHandler implements ActionListener
{
@Override
public void actionPerformed(ActionEvent event) {
}
}
第二部分:
ButtonHandler handler = new ButtonHandler();
button.addActionListener( handler );
public class ButtonHandler implements ActionListener
{
@Override
public void actionPerformed(ActionEvent event) {
}
}
另外:Java GUI可能很挑剔,而不是使用“e.getSource()==button”,您可以尝试使用“button..isFocusOwner()”您可能没有将处理程序附加到实际的按钮,因此事件将永远不会被调用 第1部分:
ButtonHandler handler = new ButtonHandler();
button.addActionListener( handler );
public class ButtonHandler implements ActionListener
{
@Override
public void actionPerformed(ActionEvent event) {
}
}
第二部分:
ButtonHandler handler = new ButtonHandler();
button.addActionListener( handler );
public class ButtonHandler implements ActionListener
{
@Override
public void actionPerformed(ActionEvent event) {
}
}
另外:Java GUI可能很挑剔,而不是使用“e.getSource()==按钮”,您可以尝试“button..isFocusOwner()”按钮、布局或选项卡式窗格有问题吗?不,它们从1999年的1.0/1.1开始就是Java的一部分。是你和你的密码。您可能没有将Listener类添加到按钮。为了更快地获得更好的帮助,请发布一条@Vulcan
==
有什么问题?这是一个身份比较。@duffymo实际上我已经将listener类添加到按钮中。“实际上我做了…”让SSCCE进行对话,然后一切都“非常清晰”。按钮、布局或选项卡式窗格有问题吗?不,它们从1999年的1.0/1.1开始就是Java的一部分。是你和你的密码。您可能没有将Listener类添加到按钮。为了更快地获得更好的帮助,请发布一条@Vulcan==
有什么问题?这是一个身份比较。@duffymo实际上我已经将listener类添加到按钮中。“实际上我已经…”让SSCCE进行对话,然后一切都“非常清晰”。事实上,我的listener并不是只连接到一个按钮上。如果我的代码有误导性,我很抱歉。请参阅我的编辑。谢谢你抽出时间!那么为什么每次你的听众被触发时你不打印一些东西呢<根据我的经验,code>getSource不是一个非常可靠的机制。你最好保持其他人的做法,即使用匿名类,每个类都专用于自己的按钮。事实上,我的侦听器并不是只连接一个按钮。如果我的代码有误导性,我很抱歉。请参阅我的编辑。谢谢你抽出时间!那么为什么每次你的听众被触发时你不打印一些东西呢<根据我的经验,code>getSource不是一个非常可靠的机制。你最好保持其他人都在做的事情,即使用匿名类,每个类都专用于自己的按钮。在这里看到我的代码@Camilla是的,我相信你是这样做的(奇怪的方式),所以试着将“e.getSource()==按钮”更改为“button1.isFocusOwner()”,看看它能做什么。我在按钮上附加了一个处理程序。在这里看我的代码@Camilla是的,我相信你是这样做的(这种方式很奇怪),所以试着将“e.getSource()==按钮”改为“button1.isFocusOwner()”,看看它能做什么。