Создание JButton нажатием JButton - PullRequest
1 голос
/ 10 июля 2019

Я работаю над проектом, в котором мне нужно нажать кнопку, чтобы создать другую кнопку. В конце концов, мне бы хотелось иметь больший контроль над позиционированием новых кнопок и возможностью создавать новые несколько раз, но сейчас ... Я просто хочу сделать один JButton Создать другой JButton.

С помощью приведенного ниже кода моя цель состоит в том, чтобы белый B1 создал красную кнопку B3. Я также хочу, чтобы синяя кнопка B2 создавала зеленую кнопку B4.

В конце концов, я также хочу, чтобы B3 и B4 (кнопки, сгенерированные из кнопок) позволяли пользователю щелкать по ним и заставлять их исчезать.

Кажется, ни одна из кнопок ничего не делает, и я не могу понять, почему. У меня есть 3 класса файлов. Любая идея, где я могу пойти не так?

Window.Java

package gui;

import javax.swing.JFrame;

public class Window {

public static void main(String[] args) {

    //frame creation
    JFrame frame = new MainFrame("Button Create Button Test");

    //frame size
    frame.setSize(800, 800);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

}
}

DetailsPanel.Java

package gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class DetailsPanel extends JPanel {
    public DetailsPanel() {
        Dimension size = getPreferredSize();
        size.width = 400;
        setPreferredSize(size);

        ///Buttons

        JButton button1 = new JButton("B1");
        button1.setPreferredSize(new Dimension (72, 73));
        button1.setBackground(Color.WHITE);
        button1.setBorderPainted(true);

        JButton button2 = new JButton("B2");
        button2.setPreferredSize(new Dimension (72, 73));
        button2.setBackground(Color.BLUE);
        button2.setBorderPainted(true);


        setLayout (new GridBagLayout());

        GridBagConstraints gc = new GridBagConstraints();

        /// Layout ///
        /// Row 1 ///

        gc.anchor = GridBagConstraints.NORTH;

        gc.weightx = 0.5;
        gc.weighty = 0.5;

        gc.gridx = 1;
        gc.gridy = 1;

        add(button1, gc);

        gc.gridx = 1;
        gc.gridy = 2;

        add(button2, gc);

        button1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JButton button3 = new JButton("B3");
                button3.setPreferredSize(new Dimension (72, 73));
                button3.setBackground(Color.RED);
                button3.setBorderPainted(true);

                gc.gridx = 1;
                gc.gridy = 3;

                add(button3, gc);
            }
        });

        button2.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JButton button4 = new JButton("B3");
                button4.setPreferredSize(new Dimension (72, 73));
                button4.setBackground(Color.GREEN);
                button4.setBorderPainted(true);

                gc.gridx = 1;
                gc.gridy = 4;

                add(button4, gc);
            }
        });
    }
}

MainFrame.Java

    package gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;

public class MainFrame extends JFrame {

    private DetailsPanel detailsPanel;

    public MainFrame(String title) {
        super(title);

        // set layout manager
        setLayout (new BorderLayout());

        // Create Swing Component
        detailsPanel = new DetailsPanel();
        detailsPanel.setBackground(Color.BLACK);

        // Add swing components to content pane
        Container container = getContentPane();

        container.add(detailsPanel, BorderLayout.WEST);



            }       
    }

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Чтобы кнопка B3 отображалась после нажатия кнопки B1, необходимо добавить ...

revalidate();
repaint();

после строки ...

add(button3, gc);

в файле DetailsPanel.java.
Аналогично для кнопки B2.

0 голосов
/ 10 июля 2019

Вы должны запустить перерисовку вашего менеджера по расположению после добавления кнопки.

* После 1003 *

  add(button3, gc);

добавить

invalidate();
validate();

Подробнее см. Документацию Swing и javadoc invalidate () и validate ().

...