Кнопки перекрываются или исчезают

У меня есть пример ошибки в моей программе. Я создал 4 кнопки: 1, 2, 3, 4. Кнопка 2 перекрывает кнопку 4, и я просто добавил события для 2 и 4.

Если я нажмите кнопку 2, она будет скрыта, и появится кнопка 4. И если я нажму кнопку 4, будет отображаться кнопка 2, а кнопка 4 снова будет закрыта кнопкой 2. Как будто что-то случилось, но, когда Я нажимаю Кнопку 1 или Кнопку 3 после выполнения вышеуказанного, Кнопка 4 отображаться, когда я указываю на него (не щелкаю), он исчезает.

public class UI extends JFrame {

    public UI(String title) {
        Container container = this.getContentPane();
        container.setLayout(null);

        JButton btn1 = new JButton("1");
        btn1.setBounds(10, 10, 50, 50);
        btn1.setBackground(Color.RED);

        JButton btn2 = new JButton("2");
        btn2.setBounds(10, 70, 50, 50);
        btn2.setBackground(Color.GREEN);

        JButton btn3 = new JButton("3");
        btn3.setBounds(10, 130, 50, 50);
        btn3.setBackground(Color.BLUE);
    
        JButton btn4 = new JButton("4");
        btn4.setBounds(10, 70, 50, 50);
        btn4.setBackground(Color.YELLOW);

        container.add(btn1);
        container.add(btn2);
        container.add(btn3);
        container.add(btn4);

        btn2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                btn2.setVisible(false);
            }
        });
        btn4.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                btn2.setVisible(true);
            }
        });
        this.setSize(400, 500);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }
}

Один столбец цветных кнопок

container.setLayout(null); Сначала исправьте это. Графические интерфейсы Java должны работать с разными ОС, размером экрана, разрешением экрана и т. д., используя разные PLAF в разных регионах. Как таковые, они не способствуют идеальной компоновке пикселей. Вместо этого используйте менеджеры компоновки или их комбинации вместе с отступами и рамками макета для пустого пространства.
Andrew Thompson 16.12.2020 08:14

спасибо за ваш комментарий, я это уже знаю, я просто хочу создать программу с фиксированным размером. Я не знаю, как создать перекрытие двух кнопок, если я использую FlowLayout или BorderLayout или что-то еще.

iamphonghg 16.12.2020 08:20

Общие советы: 1) Чтобы быстрее получить помощь, отредактируйте , чтобы добавить минимально воспроизводимый пример или Короткий, автономный, правильный пример. 2) Предоставьте иллюстрацию ASCII или простой рисунок предполагаемого макета графического интерфейса в минимальном размере и, если размер можно изменить, с большей шириной и высотой, чтобы показать, как следует использовать дополнительное пространство. 3) На скриншоте показан один столбец из трех цветных кнопок. Для одного столбца компонентов одинакового размера я бы использовал GridLayout.

Andrew Thompson 16.12.2020 08:21

Я просто хочу отобразить 2 кнопки в одном и том же положении, когда я нажимаю кнопку 1, появляется кнопка 2, а кнопка 1 скрыта

iamphonghg 16.12.2020 08:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
431
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот графический интерфейс, в котором кнопка 2 превращается в кнопку 4.

Как я сделал это? Простой. Я использовал только три JButtons.

Я изменил текст второй кнопки и цвет фона второй кнопки, как предложил Эндрю Томпсон.

Вот полный исполняемый код. Что вы знаете, это минимальный работающий пример!

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
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.JPanel;
import javax.swing.SwingUtilities;

public class JButtonExampleGUI implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new JButtonExampleGUI());
    }
    
    private Color buttonColor;
    
    private JButton button2;
    
    private String buttonText;
    
    public JButtonExampleGUI() {
        this.buttonColor = Color.GREEN;
        this.buttonText = "2";
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("JButton Example GUI");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.add(createButtonPanel(),BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    
    private JPanel createButtonPanel() {
        JPanel panel = new JPanel(new GridLayout(0, 1, 10, 10));
        panel.setPreferredSize(new Dimension(400, 500));
        
        Font font = panel.getFont().deriveFont(60f);
        
        JButton button1 = new JButton("1");
        button1.setBackground(Color.RED);
        button1.setForeground(Color.WHITE);
        button1.setFont(font);
        panel.add(button1);
        
        button2 = new JButton(buttonText);
        button2.addActionListener(new Button2Listener());
        button2.setBackground(buttonColor);
        button2.setFont(font);
        panel.add(button2);
        
        JButton button3 = new JButton("3");
        button3.setBackground(Color.BLUE);
        button3.setForeground(Color.WHITE);
        button3.setFont(font);
        panel.add(button3);
        
        return panel;
    }
    
    public void updateButton2() {
        button2.setText(buttonText);
        button2.setBackground(buttonColor);
    }
    
    public class Button2Listener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent event) {
            JButton button = (JButton) event.getSource();
            String text = button.getText();
            if (text.contentEquals("2")) {
                buttonText = "4";
                buttonColor = Color.YELLOW;
            } else {
                buttonText = "2";
                buttonColor = Color.GREEN;
            }
            updateButton2();
        }
        
    }

}

спасибо brooo, Но комментарий ниже решил то, что я хотел

iamphonghg 23.12.2020 15:32
Ответ принят как подходящий

У вас просто ошибка в методах actionPerformed(). Вам нужно изменить видимость обоих JButton, а не только одного.

Вот ваш код. Я добавил только две строчки и они отмечены комментарием // ADDED THIS LINE

public class UI extends JFrame {

    public UI(String title) {
        Container container = this.getContentPane();
        container.setLayout(null);

        JButton btn1 = new JButton("1");
        btn1.setBounds(10, 10, 50, 50);
        btn1.setBackground(Color.RED);

        JButton btn2 = new JButton("2");
        btn2.setBounds(10, 70, 50, 50);
        btn2.setBackground(Color.GREEN);

        JButton btn3 = new JButton("3");
        btn3.setBounds(10, 130, 50, 50);
        btn3.setBackground(Color.BLUE);
    
        JButton btn4 = new JButton("4");
        btn4.setBounds(10, 70, 50, 50);
        btn4.setBackground(Color.YELLOW);
        btn4.setVisible(false);  // Initially we only want to see 'btn2'.

        container.add(btn1);
        container.add(btn2);
        container.add(btn3);
        container.add(btn4);

        btn2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                btn2.setVisible(false);
                btn4.setVisible(true);  // ADDED THIS LINE
            }
        });
        btn4.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                btn2.setVisible(true);
                btn4.setVisible(false);  // ADDED THIS LINE
            }
        });
        this.setSize(400, 500);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new UI("UI"));
    }
}

Обратите внимание: хотя код работает и без него, я думаю, вам следует установить начальную видимость btn4 на false. Я также сделал это в приведенном выше коде.

Другие вопросы по теме