Почему основной метод ничего не печатает? - PullRequest
0 голосов
/ 17 сентября 2018

Я пытался выяснить, что не так с моим кодом.Я должен построить графический интерфейс и нет ошибок.Программа строится успешно, но графический интерфейс не появляется.Итак, в основном методе я закомментировал программирование GUI и добавил простой System.out.println("hello");, но он делает то же самое, то есть успешно компилирует, но ничего не печатает.Может кто-нибудь сказать, пожалуйста, что не так?Спасибо!

/*
 * To change this license header, choose License Headers in Project 
Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package gui;

import java.awt.*;
import javax.swing.*;
import java.awt.Event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class GUI extends JFrame {

    GridLayout g = new GridLayout(5, 2);
    private JLabel baseIn = new JLabel("Base Input");
    private JLabel heightIn = new JLabel("Height Input");
    private JTextField base = new JTextField();
    private JTextField height = new JTextField();
    private JTextField area = new JTextField();
    private JButton calc = new JButton("Calculate Area");

    public GUI() {
        super("Triangle Area Calculator");
        setSize(500, 300);
        setLayout(g);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(baseIn);
        add(heightIn);
        add(base);
        add(height);
        add(area);
        add(calc);
        area.setEditable(false);
        calc.addActionListener((ActionListener) this);

        pack();
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        try {
            double bInput = Integer.valueOf(base.getText());
            double hInput = Integer.valueOf(height.getText());
            double aOutput = 0.5*bInput*hInput;
            area.setText("Area of your triangle is: " + aOutput);
        } catch (NumberFormatException n) {
            System.out.println(n.getMessage());
        }
    }


    public static void main(String[] args) {
        /*JFrame frame = new JFrame();
        GUI one = new GUI();

        frame.getContentPane().add(one);
        frame.pack();
        frame.setVisible(true);*/

        System.out.println("hello world");

    }

}

Ответы [ 4 ]

0 голосов
/ 17 сентября 2018

Сначала вернемся к основному коду ...

public class GUI extends JFrame {
    //...

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        GUI one = new GUI();

        frame.getContentPane().add(one);
        frame.pack();
        frame.setVisible(true);
    }

}

Не удастся, потому что вы не можете добавить оконный компонент в окно.Как правило, вы должны избегать прямого переопределения JFrame (и других контейнеров верхнего уровня) и отдавать предпочтение чему-то менее сложному, например JPanel

public class GUI extends JPanel {
    //...
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new GUI());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

Next ...

calc.addActionListener((ActionListener) this);

Тот факт, что вам нужно выполнить приведение, чтобы заставить код работать, является явным признаком того, что что-то не так, и это может вызвать ошибку во время выполнения и привести к сбою вашей программы.Возможно, вам следует начать с чтения Как написать Action Listener и Как использовать кнопки, флажки и радиокнопки , чтобы лучше понять, как работает API

Это дополнительно поддерживается использованием аннотации @Override, которую следует использовать, когда вы «думаете», что реализуете или переопределяете существующие функции ...

@Override
public void actionPerformed(ActionEvent e) {
    //...
}

Этозатем не сможет скомпилироваться, так как вы не реализуете какой-либо существующий функционалЭта функциональность описывается интерфейсом ActionListener, который вы не реализуете.

Хотя вы могли бы реализовать этот интерфейс напрямую, я предпочитаю избегать этого, поскольку он предоставляет функциональность, к которой другие классы не должны иметь доступи вы рискуете создать метод «бога», который никогда не является хорошей идеей.

Вместо этого я предпочитаю использовать анонимные классы Java , которые предоставляют гораздо лучшие средствадля выделения функциональности в одном случае использования, например ...

calc.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        try {
            double bInput = Integer.valueOf(base.getText());
            double hInput = Integer.valueOf(height.getText());
            double aOutput = 0.5 * bInput * hInput;
            area.setText("Area of your triangle is: " + aOutput);
        } catch (NumberFormatException n) {
            System.out.println(n.getMessage());
        }
    }
});

Runnable Example

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class GUI extends JPanel {

    GridLayout g = new GridLayout(5, 2);
    private JLabel baseIn = new JLabel("Base Input");
    private JLabel heightIn = new JLabel("Height Input");
    private JTextField base = new JTextField();
    private JTextField height = new JTextField();
    private JTextField area = new JTextField();
    private JButton calc = new JButton("Calculate Area");

    public GUI() {
        setLayout(g);
        add(baseIn);
        add(heightIn);
        add(base);
        add(height);
        add(area);
        add(calc);
        area.setEditable(false);
        calc.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    double bInput = Integer.valueOf(base.getText());
                    double hInput = Integer.valueOf(height.getText());
                    double aOutput = 0.5 * bInput * hInput;
                    area.setText("Area of your triangle is: " + aOutput);
                } catch (NumberFormatException n) {
                    System.out.println(n.getMessage());
                }
            }
        });
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new GUI());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

Свойства Netbeans ...

Теперь, если все это ещерезультат не получается, вам нужно убедиться, что ваш класс GUI настроен как "Основной класс".

Начните с щелчка правой кнопкой мыши по узлу проекта Netbeans и выберите "Свойства" (он находится ввнизу).

В «Свойствах проектов» выберите «Выполнить» из опций «Сборка» внизу слева.

Убедитесь, что ваш класс GUI помечен как«Основной класс», используйте «Обзор», чтобы найти его, если он не

Project Properties

0 голосов
/ 17 сентября 2018

Попробуйте это

calc.addActionListener(new OptionButtonHandler());

Я добавил один класс optionButtonHandler, который реализует ActionListener. Я проверил свою IDE и смог получить площадь треугольника.

private class OptionButtonHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
    try {
        double bInput = Integer.valueOf(base.getText());
        double hInput = Integer.valueOf(height.getText());
        double aOutput = 0.5 * bInput * hInput;
        area.setText("Area of your triangle is: " + aOutput);
    } catch (NumberFormatException n) {
        System.out.println(n.getMessage());
    }
}
}

В вашем случае, GUI не является ActionListener, поэтому произойдет сбой.

0 голосов
/ 17 сентября 2018
  1. Можете ли вы щелкнуть правой кнопкой мыши по файлу с основным методом в Netbeans, вы должны увидеть там вариант запуска, выбрать его.Это позволит вам установить ваш основной метод.После этого должны сработать последующие нажатия на зеленую кнопку воспроизведения.

  2. Вам не нужно приводить класс Frame к ActionListener.Вместо этого заставьте его реализовать интерфейс ActionListener, и ваш код для действия кнопки должен работать.Но в будущем лучше добавить логику, чтобы определить, какой компонент вызвал действие.

0 голосов
/ 17 сентября 2018

Я не знаю, но как вы можете написать это:

calc.addActionListener((ActionListener) this);

Ваш объект (это) является JFrame, вы должны сначала добавить 'Implements ActionListener' или создать отдельную реализацию ...

Следующая ошибка, которую вы делаете:

GUI one = new GUI();
frame.getContentPane().add(one);

GUI расширяет JFrame, это JFrame, вы не можете добавить JFrame в другой!

Я тестировал с добавлением 'Implements ActionListener', и он работает, но некоторые ошибки остаются;) Копировать / вставить нужна мудрость, гул ^^

EDIT

этот код не идеален (и очень уродлив), но он работает для вашего примера:

package com.mead.helmet.core;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class GUI extends JPanel implements ActionListener {

public static void main(final String[] args) {

    JFrame frame = new JFrame("Triangle Area Calculator");

    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    GUI one = new GUI();

    frame.getContentPane().add(one);
    frame.pack();
    frame.setVisible(true);

    System.out.println("hello world");

}

GridLayout g = new GridLayout(5, 2);
private final JLabel baseIn = new JLabel("Base Input");
private final JLabel heightIn = new JLabel("Height Input");
private final JTextField base = new JTextField();
private final JTextField height = new JTextField();
private final JTextField area = new JTextField();

private final JButton calc = new JButton("Calculate Area");

public GUI() {
    super();
    setSize(500, 300);
    setLayout(g);
    add(baseIn);
    add(heightIn);
    add(base);
    add(height);
    add(area);
    add(calc);
    area.setEditable(false);
    calc.addActionListener((ActionListener) this);

    setVisible(true);
}

/**
 *
 * @param event
 */

@Override
public void actionPerformed(final ActionEvent e) {
    try {
        double bInput = Integer.valueOf(base.getText());
        double hInput = Integer.valueOf(height.getText());
        double aOutput = 0.5 * bInput * hInput;
        area.setText("Area of your triangle is: " + aOutput);
    } catch (NumberFormatException n) {
        System.out.println(n.getMessage());
    }
}

}
...