由于某种原因,我创建的窗口不会启动

时间:2017-01-04 19:51:43

标签: java methods

我的代码很乱,所以你可能无法关注它,但我正在努力制作一个YouTube转MP3转换器。

它会为用户输入JPanel以输入YouTube网址。当我尝试从JTextField获取文本时,我必须让我的方法返回一个值,这样我就可以使用我的其他类中的值,我认为这会导致我的代码无法工作。

如果有人可以帮助我,那就太好了。我对Java编码很陌生,我不确定为什么选择这么复杂的程序,但我几乎已经完成了。这是化妆品和清理代码的最后一部分:)

我的代码:

public class Bank_Statement extends JFrame {

    // width & height of window
    private static final int WIDTH = 500;
    private static final int HEIGHT = 500;

    public static final Keys text = null;

    final ActionListener convertButtonHandler = null;

    static Scanner console = new Scanner(System.in);

    static String M1;

    public static String Bank_Statement1() {
        //create/set labels
        JButton skinny = new JButton("Convert");
        skinny.addActionListener(new ButtonListener());

        JPanel buttonPane = new JPanel();
        buttonPane.add(skinny);

        JButton skinny2 = new JButton("Paste");
        JPanel buttonPane2 = new JPanel();
        buttonPane2.add(skinny2);

        JTextField text;
        text = new JTextField("                                                    ");
        JPanel textPane = new JPanel();
        textPane.add(text);

        JTextField text2 = new JTextField("----------------------------------------WAIT LIST----------------------------------------");
        JPanel textPane2 = new JPanel();
        textPane2.add(text2);

        JFrame frame = new JFrame("Youtube Converter");
        frame.setSize(WIDTH, HEIGHT);
        frame.add(textPane, BorderLayout.WEST);
        frame.add(buttonPane2, BorderLayout.CENTER);
        frame.add(buttonPane, BorderLayout.EAST);
        frame.add(textPane2, BorderLayout.PAGE_END);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        return text.getText();
    }

    public static void main(String[] args) {
        Bank_Statement recObject = new Bank_Statement();
    }

}

class ButtonListener implements ActionListener {
    ButtonListener() {}
    public void actionPerformed(ActionEvent e) {
        WebDriver driver = new HtmlUnitDriver();

        driver.get("http://www.youtubeinmp3.com/");

        String J = Bank_Statement.Bank_Statement1();
        driver.findElement(By.id("video")).sendKeys(J + Keys.ENTER);
        driver.findElement(By.id("download")).click();
        String L= driver.getCurrentUrl();
        System.out.println(L);

        try {
            Runtime.getRuntime().exec(new String[] {"cmd", "/c","start chrome " + L});
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        driver.quit();
    }

}

2 个答案:

答案 0 :(得分:0)

return text.getText();

将在Windows出现后立即执行。它不会等到用户输入一些文字。

尝试以下方法:

public class Bank_Statement extends JFrame {

    private JTextField text;
    public static Bank_Statement bank_statement;

    public Bank_Statement() {
        //create/set labels
        JButton skinny = new JButton("Convert");
        skinny.addActionListener(new ButtonListener());

        text = new JTextField("                                                    ");
        JPanel textPane = new JPanel();
        textPane.add(text);

        ...
        frame.setVisible(true);
    }

    public String getText(){
        return text.getText();
    }

    public static void main(String[] args) {
        bank_statement = new Bank_Statement();
    }

}

class ButtonListener implements ActionListener {
    ButtonListener() {}
    public void actionPerformed(ActionEvent e) {
        String J = Bank_Statement.bank_statement.getText();
        System.out.println(J);
    }
}

我在中间删除了几行以保持紧凑。我希望很清楚,否则请问。设计非常糟糕,但我并不想改变你的代码。

答案 1 :(得分:-1)

首先,我假设这是Bank_Statement类的构造函数

public static String Bank_Statement1() {
    //create/set labels
    JButton skinny = new JButton("Convert");
    skinny.addActionListener(new ButtonListener());

    JPanel buttonPane = new JPanel();
    buttonPane.add(skinny);

    JButton skinny2 = new JButton("Paste");
    JPanel buttonPane2 = new JPanel();
    buttonPane2.add(skinny2);

    JTextField text;
    text = new JTextField("                                                    ");
    JPanel textPane = new JPanel();
    textPane.add(text);

    JTextField text2 = new JTextField("----------------------------------------WAIT LIST----------------------------------------");
    JPanel textPane2 = new JPanel();
    textPane2.add(text2);

    JFrame frame = new JFrame("Youtube Converter");
    frame.setSize(WIDTH, HEIGHT);
    frame.add(textPane, BorderLayout.WEST);
    frame.add(buttonPane2, BorderLayout.CENTER);
    frame.add(buttonPane, BorderLayout.EAST);
    frame.add(textPane2, BorderLayout.PAGE_END);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

    return text.getText();
}

这是对构造函数的错误使用。 在这种情况下,您的构造函数应声明为:

public static Bank_Statement(){
    //constructor code goes here
}

然后你可以为你的JTextField值声明一个getter方法,如下所示:

public String getText(){
    return text.getText();
}

然后,一旦对象被实例化,您应该能够在任何方法中调用该方法(getText)。像这样:

public static void main(String[] args){
    //just an example...you wouldn't really want to do this
    Bank_Statement recObject = new Bank_Statement();
    recObject.getText();
}

但总的来说,这个解决方案不是一个“好”的解决方案,因为还有许多其他方法可以做得更好。这只会修复您遇到的错误。在继续之前,我会更好地了解类和对象。 :)