JTextArea в MigLayout вызывает исключение NullPointerException - PullRequest
2 голосов
/ 18 января 2012

Я не профессионал с менеджерами компоновки свинга, и это поведение совершенно сбивает меня с толку.По сути, я не могу добавить JTextArea или JTextPane в мой MigLayout без получения NullPointerException.

Я создал класс, расширяющий JPanel:

public ComponentPanel(TestComponent testComponent) {
    setLayout(new MigLayout("", "[]", "[][][][][][]"));

    JLabel lblNewLabel = new JLabel("New label");
    add(lblNewLabel, "cell 0 0");

    JButton button = new JButton("New button");
    add(button, "cell 0 3");

    JButton btnNewButton = new JButton("New button");
    add(btnNewButton, "cell 0 5");
}

Это прекрасно работает.Однако, если я попытаюсь добавить textArea, он выдаст исключение при попытке построить:

public ComponentPanel(TestComponent testComponent) {
    setLayout(new MigLayout("", "[grow]", "[][grow][][][][]"));

    JLabel lblNewLabel = new JLabel("New label");
    add(lblNewLabel, "cell 0 0");

    JTextArea textArea = new JTextArea();
    add(textArea, "cell 0 1,grow");

    JButton button = new JButton("New button");
    add(button, "cell 0 3");

    JButton btnNewButton = new JButton("New button");
    add(btnNewButton, "cell 0 5");
}

Я использую Window Designer в eclipse, поэтому я предполагаю, что что-то ускоряет работу MigLayoutконструктор?Некоторое время я бился головой об этом, и все, что мне удалось выяснить, это то, что добавление textArea или textPanes вызывает следующее исключение:

java.lang.NullPointerException at javax.swing.BoxLayout.preferredLayoutSize (Неизвестный источник) в java.awt.Container.preferredSize (Неизвестный источник) в java.awt.Container.getPreferredSize (Неизвестный источник) в javax.swing.JComponent.getPreferredSize (Неизвестный источник) в javax.swane $RootLayout.preferredLayoutSize (неизвестный источник) на java.awt.Container.preferredSize (неизвестный источник) на java.awt.Container.getPreferredSize (неизвестный источник) на javax.swing.JComponent.getPreferredSize (неизвестный источник) на java.awtor.предпочитаемый размер (неизвестный источник) в java.awt.Container.preferredSize (неизвестный источник) в java.awt.Container.getPreferredSize (неизвестный источник) в net.miginfocom.swing.MigLayout.adjustWindowSize (неизвестный источник) в net.miginfocom.swing.MigLayout.layoutContainer (неизвестный источник) по адресу net.miginfocom.swing.MigLayout.preferLayoutSize (неизвестный источник) в java.awt.Container.preferredSize (неизвестный источник) в java.awt.Container.getPreferredSize (неизвестный источник) в javax.swing.JComponent.getPreferredSize (неизвестный источник) в javax.swing.BoxLayout.cheНеизвестный источник) на javax.swing.BoxLayout.layoutContainer (Неизвестный источник) на java.awt.Container.layout (Неизвестный источник) на java.awt.Container.doLayout (Неизвестный источник) на java.awt.Container.validateTree (Неизвестный источник) на java.awt.Container.validateTree (неизвестный источник) на java.awt.Container.validateTree (неизвестный источник) на java.awt.Container.validateTree (неизвестный источник) на java.awt.Container.validate (неизвестный источник) наjava.awt.Window.show (неизвестный источник) на java.awt.Component.show (неизвестный источник) на java.awt.Component.setVisible (неизвестный источник) на java.awt.Window.setVisible (неизвестный источник) на ком.soartech.ssim.testbed.gui.TestbedApplication $ 1.run (TestbedApplication.java:25) на java.awt.event.InvocationEvent.dispatch (неизвестный источник) на java.awt.EventQueue.dispatchEventImpl (неизвестный источник) на java.awt.EventQueue.access $ 000 (неизвестный источник) на java.awt.EventQueue $ 1.run (неизвестный источник) на java.awt.EventQueue $ 1.run (неизвестный источник) на java.security.AccessController.doPrivileged (собственный метод) в java.security.AccessControlContext $ 1.doIntersectionPrivilege (неизвестный источник) в java.awt.EventQueue.dispatchEvent (неизвестный источник) в java.awt.EventDispatchThread.pilt.EventDispatchThread.pumpEventsForFilter (Неизвестный источник) в java.awt.EventDispatchThread.pumpEventsForHierarchy (Неизвестный источник) в java.awt.EventDispatchThread.pumpEvents (Неизвестный источник) в java.awt.EventDispatchThread. Неизвестный.run (Неизвестный источник) Исключение в потоке «AWT-EventQueue-0» java.lang.NullPointerException в javax.swing.SizeRequirements.calculateTiledPositions (неизвестный источник) в javax.swing.BoxLayout.layoutContainer (Неизвестный источник) в java.awt.Container.layout (неизвестный источник) на java.awt.Container.doLayout (неизвестный источник) на java.awt.Container.validateTree (неизвестный источник) на java.awt.Container.validateTree (неизвестный источник) на java.awt.Container.validateTree (неизвестный источник) наjava.awt.Container.validateTree (неизвестный источник) на java.awt.Container.validate (неизвестный источник) на java.awt.Window.dispatchEventImpl (неизвестный источник) на java.awt.Component.dispatchEvent (неизвестный источник) на java.awt.EventQueue.dispatchEventImpl (неизвестный источник) на java.awt.EventQueue.access $ 000 (неизвестный источник) на java.awt.EventQueue $ 1.run (неизвестный источник) на java.awt.EventQueue $ 1.run (неизвестный источник) на java.security.AccessController.doPrivileged (собственный метод) в java.security.AccessControlContext $ 1.doIntersectionPrivilege (неизвестный источник) в java.security.AccessControlContext $ 1.doIntersectionPrivilege (неизвестный источник) в java.awt.ruejava.awt.EventQueue $ 2.run (неизвестный источник) в java.security.AccessController.doPrivileged (собственный метод) в java.security.AccessControlContext $ 1.doIntersectionPrivilege (неизвестный источник) в java.awt.EventQueue.dispatchEventjava.awt.EventDispatchThread.pumpOneEventForFilters (неизвестный источник) в java.awt.EventDispatchThread.pumpEventsForFilter (неизвестный источник) в java.awt.EventDispatchThread.pumpEventsForHierarchy (неизвестный источник) в java.awt.EventDispatchThread.pumpEvents (неизвестный источник) в java.awt.EventDispatchThread.pumpEawt.run (Неизвестный источник)

Ответы [ 2 ]

1 голос
/ 18 января 2012

С MigLayout 4.0 ваш код отлично работает на моем компьютере.Если вы исправите исходное вложение, вы сможете углубиться в BoxLayout и получить лучшее представление о том, что происходит.

Без фактического номера строки в источнике, единственное, что я вижу вBoxLayout.preferredLayoutSize(), который может выдать, если ваш пользовательский интерфейс устанавливает Border, который возвращает нулевые вставки.Это кажется маловероятным, но вы можете попытаться установить границы для текстовой области явно, просто как эксперимент.

0 голосов
/ 18 января 2012

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

    Runnable doWorkRunnable = new Runnable() {
        public void run() {
            for(TestComponent c : Config.getComponents()){
                frame.getContentPane().add(new ComponentPanel(c));
                frame.getContentPane().add(Box.createRigidArea(new Dimension(5,0)));
            }
        }
    };
SwingUtilities.invokeLater(doWorkRunnable);

Теперь, когда все готово, я могу без проблем включать текстовые области в мой MigLayout.

...