Компоненты Swing переформатируются после события JButton - PullRequest
1 голос
/ 11 апреля 2019

Это мой первый пост здесь, поэтому, пожалуйста, прости меня, если сделаю какую-то ошибку форматирования и расскажу, как это сделать.

Я немного новичок в кодировании с GridBagLayout, поэтому мне удалосьпонять основную концепцию этого.Время от времени случается, что форматирование полностью исчезает.

Как это и должно быть, большое красивое TextPane:

https://i.imgur.com/1bozERo.png

Как это иногда бывает, TP действительно маленький:

https://i.imgur.com/84vfNJt.png

Единственный способ вызвать эту проблему - вызвать окно из JButton.Я вставил код для вызова окна (Error.showDialog(new Exception());) в нескольких местах, и, похоже, это происходит всякий раз, когда вызывается ActionListener.

Это мой диалог, печатающий сообщение об ошибке.

public static void showDialog(Exception myException) {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        PrintStream ps = new PrintStream(os);
        myException.printStackTrace(ps);



        try {
            ErrorString = os.toString("UTF8");
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        JFrame window = new JFrame("Error");
        window.setSize(550, 600);
        window.setLocationRelativeTo(null);
        window.setResizable(false);
        window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(5, 5, 5, 5);
        c.fill = GridBagConstraints.BOTH;

        c.gridy = 0;
        tpError = new JTextPane();
        tpError.setPreferredSize(new Dimension(500, 500));
        tpError.setEditable(false);
        tpError.setText(ErrorString);

        JScrollPane scrollPane = new JScrollPane(tpError, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        panel.add(scrollPane, c);

        c.gridy++;
        JPanel panelBtns = new JPanel(new FlowLayout());

        JButton btnClose = new JButton("Schließen");
        btnClose.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                window.setVisible(false);
                window.dispose();

            }
        });
        panelBtns.add(btnClose);

        JButton btnSend = new JButton("Bericht");
        btnSend.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent AE) {
                try {
                    Desktop.getDesktop().browse(new URI("mailto:my.name@mail.de?subject=Fehler%20im%20Converter"));
                    } catch (IOException | URISyntaxException ex) {
                    ex.printStackTrace();
                }

            }
        });
        panelBtns.add(btnSend);
        panel.add(panelBtns,c );

        window.add(panel);
        window.setVisible(true);
        window.repaint();
    }

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

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019
tpError.setPreferredSize(new Dimension(500, 500));

Не программируйте предпочтительные размеры.

Когда вы используете GridBagLayout, компонент будет отображаться в своем «минимальном размере», когда недостаточно места для отображения компонента в его предпочтительном размере.,Вместо этого вам нужно использовать другие ограничения, такие как ограничение «заливка», чтобы управлять тем, как компонент увеличивается / уменьшается при изменении доступного пространства.

Однако лучшее решение - НЕ использовать GridBagLayout.Вместо этого просто используйте стандартную компоновку фрейма, которая является BorderLayout.Тогда основной код будет:

JTextPane textPane = new JTextPane();
JScrollPane scrollPane = new JScrollPane( textPane );
add(scrollPane, BorderLayout.CENTER);

add(panelButtons, BorderLayout.PAGE_END);

Гораздо проще, когда вам не нужно беспокоиться о более сложных ограничениях.

0 голосов
/ 11 апреля 2019

Вы забыли установить свойство weightx и weightty для своей текстовой панели.

    JPanel panel = new JPanel(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    c.insets = new Insets(5, 5, 5, 5);
    c.fill = GridBagConstraints.BOTH;
    c.weightx = 1; // set weightx/y
    c.weighty = 1;

    c.gridy = 0;
    JTextPane tpError = new JTextPane();
    tpError.setEditable(false);
    try {
        tpError.setText(os.toString("UTF8"));
    } catch (Exception e) {
        e.printStackTrace();
    }

    JScrollPane scrollPane = new JScrollPane(tpError, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    panel.add(scrollPane, c);

    c.gridy++;
    c.weightx = 0; // clean weightx/y
    c.weighty = 0;
    JPanel panelBtns = new JPanel(new FlowLayout());

Другая возможность - установить предпочтительный размер для области прокрутки (не для JTextPane)

    JTextPane tpError = new JTextPane();
    tpError.setEditable(false);
    try {
        tpError.setText(os.toString("UTF8"));
    } catch (Exception e) {
        e.printStackTrace();
    }

    JScrollPane scrollPane = new JScrollPane(tpError, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    scrollPane.setPreferredSize(new Dimension(500, 500));
    panel.add(scrollPane, c);
...