2015-06-14 3 views
-1

Я пытаюсь изучить некоторые основные реализации GUI в Java.Доступ к объекту, созданному конструктором

У меня есть 2 класса, один из которых содержит конструктор. Этот конструктор создает новый объект JFrame.

У меня возникли проблемы с работой с этим конструктором JFrame - я хочу изменить его размер и другие операции, но не могу понять, как это сделать после вызова конструктора.

Здесь оба класса, BmrCalcMain:

import javax.swing.*; 

public class BmrCalcMain { 

    public static void main(String[] args) { 

     BmrCalcv2 frame = new BmrCalcv2(); 

     BmrCalcv2.newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     BmrCalcv2.newFrame.setVisible(true); 
     BmrCalcv2.newFrame.setSize(650, 475); 
     BmrCalcv2.newFrame.setResizable(false); 
    } 
} 

BmrCalcv2:

package v2; 
import javax.swing.*; 
import java.awt.FlowLayout; 

public class BmrCalcv2 { 

    private JLabel ageLabel; 
    private JLabel genderLabel; 
    private JLabel img1; 
    static JFrame newFrame; 

    public BmrCalcv2() { 

     newFrame = new JFrame("BMR/TDEE Calculator"); 
     newFrame.setLayout(new FlowLayout()); 

     ageLabel = new JLabel("Age:"); 
     genderLabel = new JLabel("Gender:"); 
     img1 = new JLabel(new ImageIcon("filesrc/Bodybuilding-icon.png")); 

     newFrame.add(ageLabel); 
     newFrame.add(genderLabel); 
     newFrame.add(img1); 
    } 
} 

При запуске приложения, то JLabels и изображения из BmrCalcv2 класса не появляются. Я считаю, что это связано с тем, что в главном классе использование фрейма неверно (мне нужно как-то использовать newFrame, но если я сменил фрейм на newFrame, он выдает ошибки).

Любые рекомендации приветствуются.

+3

Те же классы, я думаю, что вы вырезали и вставили неправильно. –

+1

Вы отправили 'BmrCalcMain' дважды. –

+0

Почему я получаю -1'd? – user3186023

ответ

3

Поймите, что ваш класс BmrCalcv2 использует TWO JFrames, не один. Один из них является экземпляром класса BmrCalcv2 с расширением JFrame, а другой - частным полем внутри конструктора BmrCalcv2. Вы должны избавиться от того или другого, чтобы выправить все это. Если вы решите использовать переменную, сделайте ее полем класса, а не переменной, локальной для конструктора. Или, если вы хотите использовать JFrame, что ваш класс наследуется от, то избавиться от поля newFrame:

т.е.

import javax.swing.*; 
import java.awt.FlowLayout; 

public class BmrCalcv2 extends JFrame { 
    private JLabel ageLabel; 
    private JLabel genderLabel; 
    private JLabel img1; 

    public BmrCalcv2() { 
     super("BMR/TDEE Calculator"); 
     setLayout(new FlowLayout()); 

     ageLabel = new JLabel("Age:"); 
     genderLabel = new JLabel("Gender:"); 
     img1 = new JLabel(new ImageIcon("filesrc/Bodybuilding-icon.png")); 

     add(ageLabel); 
     add(genderLabel); 
     add(img1); 
    } 
} 

Другие побочные рекомендации:

  • Обычно это лучше не, чтобы установить размеры компонентов, а также позволить компоновщикам и менеджерам макета сами по себе.
  • Поймите, что, поскольку менеджеры макета идут, FlowLayout не самый яркий в пакете, и по мере того, как ваш GUI становится более сложным, так как это, скорее всего, скоро, вы, вероятно, захотите вложить JPanels, используя более надежные макеты.
  • Ни один из моих расширяющихся графических интерфейсов JFrame, но большинство из них либо расширяют JPanel, либо направлены на создание JPanel, и таким образом я получаю большую гибкость, так как я могу разместить этот JPanel где угодно, в JFrame, JDialog, a JOptionPane, еще один JPanel, в JTabbedPane, .....
+0

Я удалил «extends JFrame», поэтому у меня есть только один внутри конструктора и задал переменную вне конструктора «static JFrame newFrame», которая затем создается с помощью конструктора - «newFrame = new JFrame (« BMR/TDEE » Калькулятор")". Кажется, это заставило его работать, оставив основной класс таким, какой он есть. Однако он говорит, что кадр переменной не используется (потому что это не так), но это хорошо? Мне нужна эта строка, независимо от того, как создать экземпляр нового объекта JFrame/добавить компоненты. – user3186023

+0

@ Ftahir192: см. Править, чтобы ответить, - я сделал как раз наоборот, как и вы, но либо сработает.Если вы избавитесь от 'extends JFrame', вам понадобится переменная newFrame, но опять же, подумайте о том, чтобы сделать это полем класса. –

+0

Благодарим за дополнительную информацию. Сначала я устанавливал локации объектов, но узнал, что это не очень хороший способ. Я согласен с тем, что в настоящее время метод FlowLayout не является идеальным. Какой менеджер макета вы порекомендовали бы сделать что-то похожее на калькулятор на этом сайте: http://iifym.com/tdee-calculator/ – user3186023

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