2011-01-04 5 views
1

У меня есть два класса, один из которых расширяется. В обоих случаях у меня есть поля, представляющие компоненты swing. Проблема в том, что что-то не так, когда я пытаюсь использовать компоненты из дочернего класса - кажется, что Swing thread не имеет доступа к дочерним компонентам. Что я делаю не так?Свинг и наследование

public abstract class AppViewBase { 
    protected JPanel jContentPane = null; 

    protected void initialize() { 
     //... 
     addOutputControlls(jContentPane); 
     //... 
    } 
    protected abstract void addOutputControlls(JPanel jContentPane) ; 
} 

public class Titrai extends AppViewBase { 
    public JTextPane line1 = null; 
    public JTextPane line2 = null; 

    protected void addOutputControlls(JPanel jContentPane2) { 
     jContentPane2.add(getJTextPane()); 
     jContentPane2.add(getJTextPane2()); 
    } 

    public void setCurrentLine(Object selectedValue) { 
     String s = (String) selectedValue; 
     getJTextPane().setText(s); 
     getJTextPane2().setText(""); 

     getJTextPane().repaint(); 
     //only gets repainted i i move line1, line2 fields to parent class 
     getJTextPane2().repaint(); 
    } 

} 

Edit - код от комментариев

if(EventQueue.isDispatchThread()) { 
    initialize(); 
} else { 
    try { 
    EventQueue.invokeAndWait(new Runnable() { 
     @Override 
     public void run() { 
     initialize(); 
     } 
    }); 
    } catch (InterruptedException e) { 
    e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
    e.printStackTrace(); 
    } 
} 

Edit 2 - код от другого Комментария OP в

JTextPane getJTextPane() { 
    if (line1 == null) { 
     line1 = new JTextPane(); 
     line1.setFont(new Font("Tahoma", Font.PLAIN, 13)); 
     line1.setForeground(Color.white); 
     line1.setPreferredSize(new Dimension(385, 16)); 
     line1.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, false); 
     line1.setEditorKit(getDefaultLineEditorKit()); 
     line1.setEditable(false); 
     line1.setLocation(new Point(15, 15)); 
     line1.setSize(new Dimension(385, 16)); 
     line1.setBackground(Color.black); 
     line1.setFocusable(false); 
     line1.setBorder(null); 
    } 
    return line1; 
    } 
+4

Нет такого ограничения. Единственное ограничение состоит в том, что ВСЕ изменения в GUI должны выполняться на EDT. Вы это делаете? – willcodejavaforfood

+0

Моя инициализация графического интерфейса выглядит так: if (EventQueue.isDispatchThread()) { \t \t initialize(); \t \t} еще { \t \t \t попробовать { \t \t \t \t EventQueue.invokeAndWait (новый Runnable() { \t \t \t \t \t @Override \t \t \t \t \t общественности недействительным запуска() { \t \t \t \t \t \t initialize(); \t \t \t \t \t} \t \t \t \t}); \t \t \t} задвижка (InterruptedException е) { \t \t \t \t e.printStackTrace(); \t \t \t} задвижка (InvocationTargetException е) { \t \t \t \t е.printStackTrace(); \t \t \t} \t \t} – miceuz

+2

Что 'getJTextPane()' делать/возврата, где она определяется? То же самое для 'getJTextPane2()'. – Ishtar

ответ

0

Эмм ... Как я вижу, вы не инициализировать это поле

protected JPanel jContentPane = null; 

Я думаю, вы должны изменить код поля как

protected JPanel jContentPane = new JPanel(); 

... потому что нуль не является «готов чтобы использовать»значение объекта :)

Я имею в виду этот метод ...

protected void initialize() { 
     //... 
     addOutputControlls(jContentPane);//<-- contain null 
     //... 
    } 

... это, казалось, работать с нулевой панели так INIT не сделано правильно.

Удача :)

Смежные вопросы