2015-02-01 2 views
0

У меня есть проблема, когда я пытаюсь вызвать JFrame, который находится в общественного меню метода в начале другого метода (addAButton) внутри того же класса но не работает. Я попытался позвонить addAButton внутри общедоступное меню, но я наклоняю, потому что я не могу поместить контейнер в этот класс. Код:Получение JFrame из исходного метода в другой метод

public class Menu { 

    public Menu(Component component) { 

     JFrame frame = new JFrame("..."); 
     frame.setSize(new Dimension(1050, 700)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(component); 

     // Set up the content pane. 
     try { 
      frame.setContentPane(new JLabel(new ImageIcon(ImageIO 
        .read(new File("res/menuBackground.png"))))); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     addComponentsToPane(frame.getContentPane()); 

     // Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
    } 



     public static void addComponentsToPane(Container pane) { 

     //some code... 

     pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS)); 

     addAButton("SP", "res/Singleplayer.png", 
       "res/Singleplayer_pressed.png", pane, true); 

     //other buttons... 
     } 



     public static void addAButton(final String text, String BtnIcon, 
      String PressBtnIcon, Container container, Boolean isEnabled) { 

     //stuff for buttons... 

     button.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if (button.getText().equals("Q")) { 
        System.exit(0); 
       } else if (button.getText().equals("SP")) { 
        Component component = new Component(); 

        //here I want to put frame.dispose to close this window for when the game window opens. 

        component.start(); 

       } else if(button.getText().equals("O")) { 

       //here I want to put frame.dispose to close this window for when the options window opens. 

        Component.Options(); 

       } 
      } 

     }); 
    } 
} 
+0

Если ответ RealSkeptic не отвечает на ваш вопрос, пожалуйста, уточните свой вопрос немного подробнее, объяснив более подробно и с большей ясностью, если это возможно, только в том, что не так. Я не уверен, что у меня есть проблема с вашей проблемой (но, надеюсь, RealSkeptic делает!). –

+0

Он сделал это, я попытался как можно яснее, но я едва мог понять это сам. Когда я попытался это решить, у меня возникли проблемы. –

+0

Отлично. Я уже несколько раз задумывался над его рекомендациями. –

ответ

2

Во-первых, общественность Menu блок кода не является методом. Это конструктор. Его функция заключается в инициализации и подготовке полей нового объекта этого класса.

Переменная frame является локальной переменной . Если вы объявите переменную внутри блока кода, ее можно использовать только внутри этого блока кода. Локальная переменная выбрасывается, как только заканчивается блок кода, где он объявлен.

Если вы хотите получить доступ к элементу данных из разных методов, это означает, что этот элемент является частью состояния объекта. То есть, объект должен хранить этот элемент внутри себя через его время жизни, так что следующий метод, который вызывается на нем, будет иметь этот элемент.

Когда элемент данных является частью состояния объекта, он должен быть объявлен как поле . То есть он не должен быть объявлен внутри какого-либо метода или конструктора, а должен быть объявлен перед всеми методами и конструкторами.

Как только вы объявили поле, вы можете инициализировать его в конструкторе. И тогда вы можете получить доступ к этому полю из любого из методов одного и того же класса.

public class Menu { 

    private JFrame frame; // This is the field declaration 

    public Menu(Component component) { 

     frame = new JFrame("..."); // Here you just initialize, not declare. 

     ... // Do the rest of your initializations 

    } 

    ... // Other methods 
} 

Теперь вы можете просто использовать поле frame в любом методе.

+0

Спасибо, я совершенно забыл об этом. Мне просто нужно было добавить статическую информацию в JFrame, потому что иначе ее нельзя идентифицировать с помощью других методов. Ты обалденный. –

+0

@AnimeGaming: не делайте JFrame или любую другую ключевую непостоянную переменную static. Ваше обоснование для этого в значительной степени устраняет проблему назад. Лучшее решение - исправить ваш другой код, чтобы не было необходимости ставить переменную JFrame. –

+0

@AnimeGaming. Причина, по которой вы сделали статическую JFrame, заключается в том, что ваши другие методы являются статическими. Но они не должны быть - они должны быть методами доступа к текущему состоянию объекта. – RealSkeptic