JButton появляется только после того, как я наведу на него курсор - PullRequest
0 голосов
/ 18 марта 2020

Вторая кнопка не видна до того, как я наведу на нее курсор.

Я знаю, что есть ответы на этот вопрос для JPanels, но, похоже, они не работают для меня.

У меня есть следующий код:

Основной класс

public class Main {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            Window w = new Window();
        });
    }
}

Мое собственное окно

public class Window implements ActionListener {

    JFrame f;
    JButton b1, b2;
    JRootPane jRootPane;

    public Window() {
        f = new JFrame("Ceaser Verschluesselung");
        f.setPreferredSize(new Dimension(480, 150));
        f.setResizable(false);
        f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        f.setLocation(720, 300);
        f.setLayout(null);
        jRootPane = f.getRootPane();

        b1 = new JButton("Verschlüsseln");
        b2 = new JButton("Entschlüsseln");
        b1.setSize(new Dimension(220, 100));
        b1.setLocation(7, 5);
        b1.setFont(new Font("1", Font.BOLD, 25));
        b1.addActionListener(this);
        b2.setSize(new Dimension(220, 100));
        b2.setLocation(237, 5);
        b2.setFont(new Font("1", Font.BOLD, 25));
        b2.addActionListener(this);
        jRootPane.add(b1);
        jRootPane.add(b2);

        f.pack();
        f.setVisible(true);
    }

    public void setVisibility(boolean b) {
        f.setVisible(b);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Verschlüsseln")) {
            new Encoder(this);
        } else if (e.getActionCommand().equals("Entschlüsseln")) {
            new Decoder();
        }
    }
}

У меня возникла эта проблема в других проекты раньше, но SwingUtilities.invokeLater() для запуска окна исправили это. В другом потоке с JPanels я выяснил, что кнопки исчезают, когда они сворачиваются, но я попробовал это с более узкими кнопками, которые ничего не изменили.

Я не добавляю классы Encoder и Decoder, я не думаю, что это нужно, пока кто-нибудь не докажет, что я не прав: D

1 Ответ

2 голосов
/ 18 марта 2020

Чтение Как использовать RootPanes . Вы не должны добавлять компоненты в RootPane. Вместо этого вы должны добавить их на панель содержимого:

Container contentPane;
//....
contentPane = f.getContentPane();

Весь класс:

public class Window implements ActionListener {

    JFrame f;
    JButton b1, b2;
    Container contentPane;

    public Window() {
        f = new JFrame("Ceaser Verschluesselung");
        f.setPreferredSize(new Dimension(480, 150));
        f.setResizable(false);
        f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        f.setLocation(720, 300);
        f.setLayout(null);
        contentPane = f.getContentPane();

        b1 = new JButton("Verschlüsseln");
        b2 = new JButton("Entschlüsseln");
        b1.setSize(new Dimension(220, 100));
        b1.setLocation(7, 5);
        b1.setFont(new Font("1", Font.BOLD, 25));
        b1.addActionListener(this);
        b2.setSize(new Dimension(220, 100));
        b2.setLocation(237, 5);
        b2.setFont(new Font("1", Font.BOLD, 25));
        b2.addActionListener(this);
        contentPane.add(b1);
        contentPane.add(b2);

        f.pack();
        f.setVisible(true);
    }

    public void setVisibility(boolean b) {
        f.setVisible(b);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Verschlüsseln")) {

        } else if (e.getActionCommand().equals("Entschlüsseln")) {
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Window());
    }
}

Кроме того, использование setLayout(null) является плохой (плохой) практикой. Вместо этого используйте менеджеры по расположению . Это облегчит вашу жизнь, плюс ваш GUI будет более удобным для пользователя, поскольку он будет поддерживать изменение размера.

...