JDialog ведет себя по-разному при каждом его создании

Я создал класс под названием CreateNewGraph это расширяет JDialogи этот класс вызывается из отдельного класса. Когда он вызывается в первый раз, он ведет себя, как и ожидалось, но в любое время после этого макет (я использую MigLayout) все испортил: компоненты расположены неправильно, и каждый компонент добавляется дважды.

Заранее извините за такой большой код, я хочу включить все это, потому что я не знаю, в чем проблема.

Вот код для CreateNewGraph:

public class CreateNewGraph extends JDialog {

private static final JPanel contentPanel = new JPanel();
private static JPanel buttonPanel;
private static JTextField txtFldName;
private static Font directionFont = new Font("TimesRoman", Font.PLAIN, 15);
private static JTextPane txtPaneTypeError, txtPaneNameError, txtPaneEnterName;
private static JButton okButton, cancelButton;
private static JRadioButton rdbtnXYGraph, rdbtnTimeGraph;
private static ButtonGroup kind;
private static JLabel lblWhichKind, lblName;

/**
 * Create the dialog.
 */
public CreateNewGraph() {
    setTitle("Add a New Graph");
    setModalityType(ModalityType.APPLICATION_MODAL);
    setModal(true);
    setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    getContentPane().setLayout(new BorderLayout());

    contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
    getContentPane().add(contentPanel, BorderLayout.CENTER);
    contentPanel.setLayout(new MigLayout("", "[grow]", "[][][][][][][grow][grow]"));

    lblWhichKind = new JLabel("What kind of graph would you like to add? You may select only one.");
    lblWhichKind.setFont(directionFont);
    contentPanel.add(lblWhichKind, "cell 0 0");

    kind = new ButtonGroup();

    Component strutRadioBtns = Box.createHorizontalStrut(20);
    contentPanel.add(strutRadioBtns, "flowx,cell 0 1");

    rdbtnXYGraph = new JRadioButton("XY Graph");
    contentPanel.add(rdbtnXYGraph, "cell 0 1");
    kind.add(rdbtnXYGraph);

    rdbtnTimeGraph = new JRadioButton("Time Graph");
    contentPanel.add(rdbtnTimeGraph, "cell 0 1");
    kind.add(rdbtnTimeGraph);

    Component verticalStrut = Box.createVerticalStrut(10);
    contentPanel.add(verticalStrut, "cell 0 2");

    txtPaneEnterName = new JTextPane();
    txtPaneEnterName.setText("What would you like to name this graph? It must be a unique name (you may not use one you have already used.)");
    txtPaneEnterName.setFont(directionFont);
    txtPaneEnterName.setEditable(false);
    txtPaneEnterName.setOpaque(false);
    contentPanel.add(txtPaneEnterName, "cell 0 3,grow");

    Component horizontalStrut = Box.createHorizontalStrut(20);
    contentPanel.add(horizontalStrut, "flowx,cell 0 4");

    lblName = new JLabel("Name:");
    contentPanel.add(lblName, "cell 0 4");

    txtFldName = new JTextField();
    contentPanel.add(txtFldName, "cell 0 4");
    txtFldName.setColumns(10);

    Component verticalStrut_1 = Box.createVerticalStrut(10);
    contentPanel.add(verticalStrut_1, "cell 0 5");

    txtPaneTypeError = new JTextPane();
    txtPaneTypeError.setText("Graph Type Error: ");
    txtPaneTypeError.setEditable(false);
    txtPaneTypeError.setOpaque(false);
    contentPanel.add(txtPaneTypeError, "cell 0 6,grow");

    txtPaneNameError = new JTextPane();
    txtPaneNameError.setText("Graph Name Error: ");
    txtPaneNameError.setEditable(false);
    txtPaneNameError.setOpaque(false);
    contentPanel.add(txtPaneNameError, "cell 0 7,grow");

    buttonPanel = new JPanel();
    buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
    getContentPane().add(buttonPanel, BorderLayout.SOUTH);

    okButton = new JButton("OK");
    okButton.setActionCommand("OK");
    buttonPanel.add(okButton);

    cancelButton = new JButton("Cancel");
    buttonPanel.add(cancelButton);
    getRootPane().setDefaultButton(cancelButton);
}

у меня тоже есть ActionListeners на каждой кнопке, но я удалил их для краткости. Обычно я не публикую столько кода, но я не уверен, где происходит ошибка (исключений нет.)

И код, который я использую в другом классе, чтобы создать экземпляр CreateNewGraph:

EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        CreateNewGraph add = new CreateNewGraph();
                        add.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });

Вот что происходит, когда он открывается в первый раз: Первый раз

Этот первый случай именно так и должен выглядеть. Но во второй раз это происходит: Второй раз маленький Это второй случай, расширенный, чтобы заполнить мой экран: Второй раз полный

1 ответ

Решение

Вы убиваете себя статическими компонентами, которые повторно добавляются в статические JPanels, которые разрушают ваш графический интерфейс. Решение: сделайте все поля экземпляра полей класса JDialog. Это позволит вам создавать их заново при создании объекта, чтобы вы не испортили свой макет. Дополнительным бонусом является то, что вы также будете следовать хорошей практике ООП.

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