Java: изменение размера JTextField (все еще) при сворачивании (новая информация) - PullRequest
1 голос
/ 20 января 2012

Я первоначально разместил вопрос здесь

Я обнаружил, что JTextField изменяет размер, только если JScrollPane существует.Другими словами, я могу свернуть и развернуть все, что захочу, пока не появится полоса прокрутки (потому что в окне слишком много текста).После этого, если я сверну окно, JTextField утроится в вертикальном размере.Надеемся, что эта новая информация приведет к возможному решению.Пожалуйста, напишите, если у вас есть идеи, спасибо.

1 Ответ

6 голосов
/ 20 января 2012

Я не большой парень, который будет использовать GridBagLayout, похоже, вся проблема в ваших настройках Layout.

Похоже, что вы пропустили чтение GridBagLayout Tutorials , в нем четко указано, что "возможно повторно использовать один и тот же экземпляр GridBagConstraints для нескольких компонентов, даже если компоненты имеют разные ограничения. Однако не рекомендуется повторно использовать GridBagConstraints, поскольку это может очень легко привести к появлению незначительных ошибок, если вы забудете сбросить поля для каждого нового экземпляра. "

Так что после прочтения я немного улучшил ваш собственный код, надеюсь, вы не против: -)

Что я сделал, так это то, что я создал два разных объекта GridBagConstraints, по одному на каждую из ваших полос прокрутки и текстового поля, чтобы они могли иметь разные значения. Поскольку вы использовали один и тот же объект для обоих компонентов, т.е.

c.weightx = 1.0;
c.weighty = 1.0;

Теперь, пока полоса прокрутки не появляется, все идет хорошо, но как только она появляется, вы минимизируете окно, а затем восстанавливаете окно, а затем перерисовываете окно на экране, поскольку значения для весовых коэффициентов то же самое для обоих компонентов, поэтому они пытаются занять равную площадь окна по оси Y.

Поэтому, чтобы избежать этого, я сделал два объекта с разными значениями для весов вдоль Ось Y , где JTextArea, являющийся могущественным , получил более высокое значение, то есть Weighty = 0,8 и JTextField не такой мощный с точки зрения его использования в настоящем сценарии, следовательно, ему был присвоен вес Weighty = 0,2 .

Я перестроил код снова для вашего дополнительного понимания. Использование разных объектов GridBagConstraint для разных компонентов - выход из сложившейся ситуации.

Посмотрите на код сейчас:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Console extends JPanel implements ActionListener
{
    boolean ready = false;
    protected JTextField textField;
    protected JTextArea textArea;
    private final static String newline = "\n";
    //Game m_game;
    Thread t;

    public Console(/*Game game*/) 
    {
        super(new GridBagLayout());

        //m_game = game;
        textField = new JTextField(20);
        textField.setPreferredSize(null);
        textField.addActionListener(this);

        textArea = new JTextArea(20, 60);
        textArea.setEditable(true);
        textArea.setWrapStyleWord(true);
        textArea.setLineWrap(true);
        Font comic = new Font("Serif", Font.PLAIN, 14);
        textArea.setFont(comic);
        JScrollPane scrollPane = new JScrollPane(textArea);

        //Add Components to this panel.
            // This first object serves as providing values to the TEXTAREA.
        GridBagConstraints c = new GridBagConstraints();
        c.gridwidth = GridBagConstraints.REMAINDER;

        c.fill = GridBagConstraints.HORIZONTAL;
        c.fill = GridBagConstraints.BOTH;
        c.weightx = 1.0; 
        c.weighty = 0.8;// This being mighty has been given weight as 0.8, the highest.

        // This second object serves as providing values to the TEXTFIELD.
        GridBagConstraints c1 = new GridBagConstraints();
        c1.gridwidth = GridBagConstraints.REMAINDER;

        c1.fill = GridBagConstraints.HORIZONTAL;
        c1.fill = GridBagConstraints.BOTH;
        c1.weightx = 1.0;
        c1.weighty = 0.2;  // Since this has to occupy less space, hence weight is less also.
        add(scrollPane, c);
        add(textField, c1);
    }

    public void actionPerformed(ActionEvent evt) 
    {
        String text = textField.getText();
        //m_game.input = text;
        textField.selectAll();
        textArea.setCaretPosition(textArea.getDocument().getLength());
        //m_game.wait = false;
        /*synchronized (m_game)
        {
            ready = true;
            m_game.notifyAll();
        }*/
    }

    public static void createAndShowGUI() 
    {
        //Create and set up the window.
        JFrame frame = new JFrame("Game");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Add contents to the window.
        frame.setContentPane(new Console());

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowGUI();
                }
            });
    }
}   
...