【问题标题】:Java Swing button actionEventJava Swing 按钮动作事件
【发布时间】:2014-05-18 17:15:10
【问题描述】:

很抱歉打扰大家。

总体问题:我正在尝试打开一个对话框让用户输入内容然后关闭它

问题: - 没有调用函数(我认为) - 主要问题是当我使用调试时它工作正常,所以我很难找到问题

我在使用 JButton 时遇到问题, 它在调试中有效,但在正常运行中无效。这可能是因为我使用的是无限循环。网上有人建议我使用 SwingUtilities,但没有用(至少我不这么认为。

/**
 *
 * @author Deep_Net_Backup
 */
public class butonTest extends JFrame  {
String name;
boolean hasValue;

//name things
private JLabel m_nameLabel;
private JTextField m_name;

//panel
private JPanel pane;

//button
private JButton m_submit;

//action listener for the button submit
class submitListen implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        submit();
        System.out.println("Test");
    }
}

//constructor
public butonTest(){
    //normal values
    name = null;
    hasValue = false;
    //create the defauts
    m_nameLabel = new JLabel("Name:");
    m_name = new JTextField(25);
    pane = new JPanel();
    m_submit = new JButton("Submit");
    m_submit.addActionListener(new submitListen());
    //

    setTitle("Create Cat");
    setSize(300,200);
    setResizable(false);

    //add components
    pane.add(m_nameLabel);
    pane.add(m_name);

    pane.add(m_submit);

    add(pane);
    //last things
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

}

//submit
private void submit()
{
    System.out.println("submit");
    name = m_name.getText();
    hasValue = true;
}

//hasValue
public boolean hasValue()
{
    return(hasValue);

}

//get the text name
public String getName()
{
    return(name);
}

public void close()
{
    setVisible(false);
    dispose();
}

public static void main(String[] args)
{

    /* Test 1
    boolean run = true;
    String ret = new String();
    butonTest lol = new butonTest();

    while(run)
    {
        if(lol.hasValue())
        {
            System.out.println("Done");
            run = false;
            ret = new String(lol.getName());
            lol.close();
        }
    }



    System.out.println(ret);*/

    //Tset 2
    /*
    SwingUtilities.invokeLater(new Runnable(){
        @Override
        public void run() {
            butonTest lol = new butonTest();
            if(lol.hasValue())
            {
                System.out.println(lol.getName());
            }
        }
    });*/

}

}

编辑: 它是如何不工作的:当我运行测试时,程序将打印测试并提交,然后它应该将 hasValue 更改为 true。这将(希望)允许 if 语句运行以打印完成。这不会发生。

编辑 2: 我刚刚添加了几行以进一步测试 2 次打印,这似乎解决了问题(但这很糟糕) System.out.println("hasValue" + hasValue); -> 到 hasValue() 函数 System.out.println("设置为真"); -> 提交()函数

【问题讨论】:

  • 怎么不工作了?请向我们提供重要的详细信息,并假设我们对您的问题或代码一无所知。
  • 你想做什么?你只是想关闭对话框吗?
  • Test1,你的 while 循环阻塞了 ui。 Test2,您对hasValue() 的调用只会影响您调用它的一次,这是错误的
  • 我正在尝试打开一个对话框让一些用户输入返回然后关闭它
  • How to use Dialogs。你想要的是JOptionPane

标签: java swing jbutton actionevent


【解决方案1】:

您正在做的事情过于复杂而不必要。您可以将其作为匿名类,而不是将侦听器作为单独的类。这样你就可以获得外部类(buttonTest.this)的句柄,并调用任何你想要的方法。

m_submit.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        submit();
        System.out.println("Test");
        butonTest.this.close();
    }
});

我不确定你想用无限循环做什么。无论如何,它会在您显示对话框之前运行完成。

了解一下事件处理在 Swing 中的工作原理会有所帮助:)

【讨论】:

  • 谢谢 :D,我会多读一些,我一直在网上,并查看了“Java 如何编程”,但我想我更专注于 GUI 而不是然后对事件进行深入研究
【解决方案2】:

恐怕你的构造函数 butonTest() 和 submit() 方法超出了你的 类(公共类 buttonTest 扩展 JFrame)。

你需要让他们进入你的班级:

【讨论】:

  • 对不起,我没有正确地间隔最后一个花括号
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
相关资源
最近更新 更多