Почему панель появляется только в том случае, если я сначала установил Visible (false)? - PullRequest
0 голосов
/ 23 марта 2020

Если я нажимаю на элемент меню «включить», он показывает панель, но только если я сначала setVisible(false), если я удаляю эту строку, он перестает работать.

В ActionListener я для menuItem я создаю новую панель с меткой внутри, но эта метка будет отображаться на экране только в том случае, если после ее создания я сначала вызову setVisible(false).

MainWindow. java

package main;

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

@SuppressWarnings("serial")
public class MainWindow extends JFrame {
    MainWindow() {
        super("Carros");
        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setExtendedState(Frame.MAXIMIZED_BOTH);
        this.getContentPane().setLayout((null));
        getContentPane().setLayout(null);

        JMenuBar jMenuBar = new JMenuBar();
        jMenuBar.setBounds(0, 0, 606, 21);
        this.getContentPane().add(jMenuBar);

        JMenu carMenu = new JMenu("Carros");
        jMenuBar.add(carMenu);

        JMenuItem includeMenuItem = new JMenuItem("Incluir");
        carMenu.add(includeMenuItem);

        includeMenuItem.addActionListener(e -> showIncludePanel());
    }

    private void showIncludePanel() {
        JPanel panel = new JPanel();
        panel.setVisible(false);
        panel.setBounds(5, 20, 431, 241);
        this.getContentPane().add(panel);
        JLabel label = new JLabel("Primeiro panel");
        panel.add(label);
        panel.setVisible(true);
    }
}

Main. java

package main;

public class Main {
    public static void main(String[] args) {
        MainWindow mainWindow = new MainWindow();
        mainWindow.setVisible(true);
    }
}

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Позвоните this.pack() на фрейм после добавления нового компонента.

Кроме того, фрейм позволяет установить строку меню «J» (Swing). Старайтесь не использовать как можно больше AWT ... по крайней мере, не смешивайте его с компонентами Swing, так как это старая тяжелая библиотека.

Я настроил поток программы, чтобы сделать ее более понятной и удобной для чтения.

MainWindow. java

package q60816855;

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

public class MainWindow extends JFrame implements Runnable {
    public MainWindow() {
        super("Carros");
        this.setLayout(null); // Same as calling null on the content pane

        createMenu();
    }

    @Override
    public void run() {
        this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.setVisible(true);
    }

    private void createMenu() {
        JMenuBar jMenuBar = new JMenuBar();

        JMenu carMenu = new JMenu("Carros");
        jMenuBar.add(carMenu);

        JMenuItem includeMenuItem = new JMenuItem("Incluir");
        carMenu.add(includeMenuItem);

        this.setJMenuBar(jMenuBar);

        System.out.println(this.getContentPane().getPreferredSize());

        includeMenuItem.addActionListener(e -> {
            this.getContentPane().add(createIncludePanel());
            this.pack();
        });
    }

    private JPanel createIncludePanel() {
        JPanel panel = new JPanel();
        JLabel label = new JLabel("Primeiro panel");

        label.setHorizontalAlignment(JLabel.CENTER);
        panel.setLayout(new BorderLayout());
        panel.setBounds(20, 20, 431, 241);
        panel.setBackground(Color.LIGHT_GRAY);
        panel.add(label, BorderLayout.NORTH);

        return panel;
    }
}

Main. java

package q60816855;

import javax.swing.*;

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new MainWindow());
    }
}
0 голосов
/ 23 марта 2020

Это не окончательный ответ, а скорее потенциальный ответ. возможно потому что вы используете нулевой макет для панели содержимого, что компонент не был проверен. Попробуйте создать окно window.validate () или window.invalidate () после создания окна, чтобы проверить, работает ли оно.

...