2017-02-08 9 views
1

У меня есть класс BaseWindow с основным фреймом JFrame и множество методов, которые работают на mainFrame. Фактические окна в моем приложении выполняются путем расширения BaseWindow.Как я могу заставить Eclipse WindowBuilder разобрать унаследованный JFrame?

Класс, расширяющий BaseWindow, наследует mainFrame, и это как-то мешает оконному строителю «видеть» его при анализе кода. Все, что я вижу на вкладке дизайна конструктора окна, - это пустое окно, но когда я запускаю код, все работает нормально.

Как я могу сделать этот подход работать с конструктором окна или конструктором окон «trick» в разборе mainFrame? Ниже приведен пример класса расширения BaseWindow:

package GUIApp; 

//took out the imports to save space 

class SampleWindowOne extends BaseWindow{ 


    public JLabel txtSampleText; 
    public JButton btnMagicButton; 

    public SampleWindowOne() { 
     initialize(); 
    } 

    public void run(){ 
     mainFrame.setBounds(getCenteredBounds()); 
     mainFrame.setVisible(true); 
    } 

    private void initialize() { 

     mainFrame = new JFrame(); 
     mainFrame.setBounds(100,100,700,525); 
     mainFrame.setTitle("Sample Window One"); 
     mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     mainFrame.getContentPane().setLayout(null); 

     txtSampleText = new JLabel(); 
     txtSampleText.setFont(new Font("Dialog", Font.PLAIN, 25)); 
     txtSampleText.setHorizontalAlignment(SwingConstants.CENTER); 
     txtSampleText.setText("Sample Window"); 
     txtSampleText.setBounds(12, 50, 674, 51); 
     mainFrame.getContentPane().add(txtSampleText); 

     JTextArea txtrLoremIpsumDolor = new JTextArea(); 
     txtrLoremIpsumDolor.setEditable(false); 
     txtrLoremIpsumDolor.setFont(new Font("Dialog", Font.PLAIN, 16)); 
     txtrLoremIpsumDolor.setForeground(Color.DARK_GRAY); 
     txtrLoremIpsumDolor.setWrapStyleWord(true); 
     txtrLoremIpsumDolor.setLineWrap(true); 
     txtrLoremIpsumDolor.setText("Lorem ipsum dolor sit amet..."); 
     txtrLoremIpsumDolor.setBounds(57, 131, 609, 296); 
     mainFrame.getContentPane().add(txtrLoremIpsumDolor); 

     btnMagicButton = new JButton("End Program"); 
     btnMagicButton.setEnabled(false); 
     btnMagicButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       requestTerminate(); 
      } 
     }); 
     btnMagicButton.setBounds(257, 451, 175, 25); 
     mainFrame.getContentPane().add(btnMagicButton); 

    } 
} 
+0

'txtrLoremIpsumDolor.setBounds (57, 131, 609, 296);' ?? –

+4

Примечание. Я не использую оконные сборщики, но я делаю много кодирования Swing, и эта строка выше никогда не должна присутствовать, потому что она ограничивает естественное поведение JTextArea. JTextAreas принадлежат JScrollPanes и таким образом ограничивают его размер, вы предотвращаете расширение текстовой области - это означает, что полосы прокрутки никогда не будут работать. Я предлагаю вам отказаться от использования разработчиков окон, пока вы не поймете базовую библиотеку лучше. –

+0

Хорошая информация, на воздушной подушке. Я определенно мог бы извлечь выгоду из более глубокого понимания Swing, но на данный момент мне просто нужно снова использовать возможности дизайна WYSIWYG. Я пишу код для класса, в котором дизайн GUI, который мы изучали до сих пор, очень рудиментален и исключительно сделан через оконный строитель, поэтому мои члены группы и я вроде как должны иметь возможность использовать ее для текущего проекта. – jgardner7289

ответ

0

Хорошо, я нашел способ обмануть окна строителя в рабочее! Я изменил конструктор от:

public SampleWindowOne() { 
    initialize(); 
} 

к:

public SampleWindowOne() { 
    JFrame mainFrame; 
    initialize(); 
} 

Надеюсь, это поможет кому-то со своим собственным кодом.

Редактировать: не полностью решена в конце концов, см. Ниже. Я обновлю, если найду лучшее решение.

Edit2: Хорошо, после хорошего ночного сна решение довольно очевидно. Теперь я объявляю отдельный JFrame в начале класса. Я добавляю все мои элементы в этом кадре вместо мэйнфреймов, и в конце Initialize я поставил

mainFrame = newFrame; 
+0

Хм. При дальнейших экспериментах кажется, что оконный конструктор теперь разбирает существующий код, но падает, когда я пытаюсь добавить новые элементы. Он способен модифицировать существующие. Все еще не полное решение. – jgardner7289

+2

Этот код 'public SampleWindowOne() { JFrame mainFrame; initialize(); } 'объявляет локальную переменную, которая никогда не инициализируется и выходит за пределы области действия в конце конструктора. Это не принесет ничего хорошего. Кроме того, вы, кажется, «кодируете по магии» (шлепая случайные высказывания в среду IDE в надежде, что они будут магически работать), которые * никогда не работают. –

+0

Я понимаю, что переменная выходит за пределы области после завершения работы конструктора. Я предположил, что вставка этой строки «обманет» конструктора окон в возможность разбора JFrame в вопросе, и я был прав. Объявление mainFrame внутри класса заставляет конструктор окон искать его при разборе метода initialize. Проблема в том, что хотя оконный конструктор теперь может разбирать JFrame, он не может добавлять новые элементы. Я надеялся, что кто-то, у кого есть опыт работы с этим конкретным инструментом проектирования, может взвешиваться надлежащим образом, чтобы выполнить то, что я пытаюсь сделать. – jgardner7289

1

Я уверен, что вы в прошлом, что сейчас, но и для других поисковых решение это:

в затмении идут к:
Window -> Preferences -> Window Builder (дерево) -> Swing -> Генерация кода

    метод
  1. Set initGUI из комбинированного окна O f «Имя метода для новых операторов» в верхней части страницы. (вы также можете попытаться установить другое имя метода)
  2. В разделе «Генерация переменных» нажмите один раз на третьей вкладке: «Init. Field», чтобы вы могли видеть его квадрат, заполненный знаком v (и другим вкладки имеют пустой квадрат).
  3. Нажмите ОК.

  4. Перезапустить затмение.

  5. Создать метод с именем initGUI следующим образом:

    private void initGUI() { 
    
    } 
    
  6. Copy все ваш код из конструктора к этому методу.

  7. Вызов этот метод из вашего конструктора:

    public WindowTest() 
    { 
        initGUI(); 
    } 
    
  8. Перейти к окну дизайн строитель, нажав: «Дизайн» в нижней части редактора.
  9. Нажмите, если необходимо, много повторной обработки.
  10. Теперь добавьте один компонент (например, JButton) в окно и посмотрите, как он переходит в метод iniGUI. Как только вы увидели, что это происходит - безопасно вынимать строки кода, которые не используются в графическом интерфейсе этого метода, и поместить их в конструктор, если хотите.