JFrame: не удается запустить новое окно

#java #swing #jframe

#java #качать #jframe

Вопрос:

Я пытаюсь изучить Java и JFrames. Я собрал это простое приложение, в котором основной класс запускает класс MainGui. MainGui будет содержать кучу кнопок, каждая из которых выполняет что-то свое (сейчас у него есть только canadaFlagButton). У меня нет проблем с открытием окна для MainGui с помощью кнопки, которую я создал.

Однако, когда я нажимаю кнопку canadaFlagButton, предполагается, что она запускает новое окно, но вместо этого ничего не происходит.

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

public class MainGui extends JFrame implements ActionListener {

    JButton canadaFlagButton;

    MainGui() {

        canadaFlagButton = new JButton("Canada Flag");
        canadaFlagButton.setBounds(100, 100, 200, 50);
        canadaFlagButton.setFocusable(false);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(400, 600);
        this.setLayout(null);
        this.add(canadaFlagButton);
        this.setVisible(true);

    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if(e.getSource()==canadaFlagButton) {
            CanadaFlag window1 = new CanadaFlag();
        }
    }
}

//Can I draw the Canadian flag?
  

Это класс CanadaFlag:

 import javax.swing.*;
import java.awt.*;

public class CanadaFlag extends JFrame {

    CanadaFlag() {

        //creating label for maple leaf
        JLabel leafLabel = new JLabel();
        ImageIcon leaf = new ImageIcon("mapleleaf.png");
        leafLabel.setIcon(leaf);
        leafLabel.setVerticalAlignment(JLabel.CENTER);
        leafLabel.setHorizontalAlignment(JLabel.CENTER);    
        JPanel redLeftPanel = new JPanel();
        redLeftPanel.setBackground(Color.red);
        redLeftPanel.setBounds(0, 0, 400, 1000);

        JPanel redRightPanel = new JPanel();
        redRightPanel.setBackground(Color.red);
        redRightPanel.setBounds(1000, 0, 400, 1000);

        JPanel whiteMiddlePanel = new JPanel();
        whiteMiddlePanel.setBackground(Color.white);
        whiteMiddlePanel.setBounds(400, 0, 600, 1000);
        whiteMiddlePanel.setLayout(new BorderLayout());

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(null);
        this.setSize(1400, 1000);
        this.setVisible(true);
        this.add(redLeftPanel);
        this.add(redRightPanel);
        this.add(whiteMiddlePanel);
        whiteMiddlePanel.add(leafLabel);


    }

}
  

Ответ №1:

  1. Приложение должно иметь только один основной JFrame. Если вам нужны другие окна, вы обычно используете JDialog.

  2. Swing был разработан для использования с Layout manager. Если вы пытаетесь изучить Swing, ознакомьтесь с руководством Swing по менеджерам компоновки для получения дополнительной информации и рабочего примера.

предполагается, что оно запускает новое окно, но вместо этого ничего не происходит

Вы никогда не добавляете ActionListener к кнопке.

 canadaFlagButton.addActionListener( this );
  

В руководстве также есть раздел How to Use Buttons , содержащий рабочий пример. Я предлагаю вам сохранить ссылку на учебник для примеров всех основ Swing.

Комментарии:

1. Спасибо, я забыл ActionListener! Я сохраню эту ссылку в закладках, выглядит очень полезно.

2. @SushiCode, рад, что это помогло. Не забудьте «принять» ответ, нажав на галочку (рядом с ответом), чтобы люди знали, что проблема решена.