Не удается обновить JPanel при нажатии кнопки - PullRequest
0 голосов
/ 04 декабря 2011

Я новичок в java swing и у меня проблема с обновлением панели. Можете ли вы сказать мне, почему после нажатия на кнопку JTextField не отображается в основной панели? Заранее спасибо:)

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      

    javax.swing.JTextField t = new javax.swing.JTextField("Hello");  
    mainPanel.add(t);      
    mainPanel.validate();
} 

Ответы [ 3 ]

0 голосов
/ 04 декабря 2011

Возможно, вы забыли установить макет mainPanel?

Попробуйте следующее:

mainPanel.setLayout(new FlowLayout());
mainPanel.add(new JTextField("Hello!"));
mainPanel.validate();

UPDATE:

Вышеупомянутое предложение не было достаточно умным.

Как указано camickr , FlowLayout является макетом по умолчанию для JPanel.

Следующее предложение будет более полезным, я надеюсь.

Пример, моделирование ситуации.

import java.awt.EventQueue;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class JPanelDefaultLayoutTest extends JFrame {
    private JPanel mainPanel;

    public JPanelDefaultLayoutTest () {
        initComponents();
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JPanelDefaultLayoutTest().setVisible(true);
            }
        });
    }

    private void initComponents() {
        setTitle("Add hello.");
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        mainPanel = new JPanel();        

        JButton button = new JButton();   
        button.setText("Button");
        button.setToolTipText("Press me.");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                JTextField hello = new JTextField("Hello!");
                mainPanel.add(hello);
                mainPanel.revalidate();
            }
        });

        setContentPane(mainPanel);
        mainPanel.add(button);
//        pack();
    // If you comment the next line (and uncomment the pack() method above),
    // you have to resize the frame manually,
    // to see the added hello after the button press.
        setSize(200, 75);
    }
}

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

0 голосов
/ 05 декабря 2011

Вот моя глупая дикая догадка @ss: вы используете NetBeans для создания своего графического интерфейса, а контейнер, который должен принимать новый JTextField, mainPanel, использует NetBeans GroupLayout, который имеет большие трудности при размещении компонентов.добавлено на лету.Если это так, пусть mainPanel использует более удобный для пользователя макет или вложит контейнеры, каждый из которых использует собственную простую компоновку, чтобы получить сложный графический интерфейс.

Вы можете прочитать о том, как использовать эти менеджеры макетов, здесь: Размещение компонентов в контейнере

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

0 голосов
/ 04 декабря 2011

Вы пытались вызвать revalidate () вместо validate ()?

...