2013-10-02 4 views
-1

Я задал аналогичный вопрос некоторое время назад, поэтому прошу прощения за это, если я злоупотребляю сайтом, сделав это, но этот вопрос немного другой. У меня есть класс Main, в котором я создал JFrame и JPanel. Чтобы избежать беспорядка, я создал еще один класс под названием «Кнопки», чтобы держать все мои JButtons. Я хочу добавить свой JButton в mainPanel (мой JPanel), но у меня возникли проблемы с наследованием доступа к mainPanel из класса Button.Передача информации JButton от одного класса до основного класса

Вот мой главный класс:

package main; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Main extends JPanel { 
    public Main() { 
     Main m = new Main(); 
     //The main window 
     JFrame Main = new JFrame("Don't Blink"); 
     Main.setSize(500,500); 
     Main.setResizable(false); 
     Main.setVisible(true); 
     Main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //The main window's panel 
     JPanel mainPanel = new JPanel(); //I want to add buttons to this panel from the Buttons class 
     mainPanel.setSize(500, 500); 
     mainPanel.setVisible(true); 
     Main.add(mainPanel); 
    } 

    public static void main(String[] args) { 
     Main m = new Main(); 
     } 
} 

Кнопки Класс:

package main; 

import javax.swing.JButton; 

public class Buttons extends Main { 
    public Buttons(Main m) { 
     //The button to get a job 
     JButton workButton = new JButton("Get a job"); 
     mainPanel.add(workButton);//The mainPanel here gives me 
             //the error "mainPanel can 
             //not be resolved". It 
             //doesn't seem to recoginze 
             //mainPanel 
    } 
} 
+0

Возможно, вам не хватает вызова super() в конструкторе кнопок. И вызовите новые кнопки вместо нового Main – porfiriopartida

+0

[Read this] (http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html), есть некоторая путаница с вашей стороны в отношении наследования. Он не будет работать так, как вы пытаетесь. –

+0

Пока у вас есть вопросы: 8, Ответы: 12, Принятые ответы: ** 0 **. Повторите [ваши вопросы] (http://stackoverflow.com/users/2446135/user163505?tab=questions) & [accept] (http://meta.stackexchange.com/a/65088/155831) ответы! –

ответ

1

Несколько вопросов здесь ... прежде всего это ужасный дизайн ООП, но давайте посмотрим ...

Вы должны добавить как переменный класс вашего mainPanel

public class Main extends JPanel { 
    JPanel mainPanel; 

Теперь, чтобы начать Вас не объявить тип, так как вы хотите, чтобы он в области видимости класса:

this.mainPanel = new JPanel(); // I want to add buttons to this panel from the Buttons class 

вы пытаетесь вызвать его в кнопки, но вы только объявили его локально в вашем главном конструкторе.

Вы вызываете новый Main внутри нового Main, я считаю, что это закончится бесконечной рекурсией.

удалить Main m = new Main(); с вашего главного конструктора.

Я не думаю, что наследование Main on Buttons является хорошим, но если вам это действительно нужно, Main не знает о кнопках, в любом случае вы можете использовать основной метод в Buttons вместо Main. Я удаляю основной метод из класса Main и добавляю его в класс Buttons, потому что он все равно расширяет Main.

public static void main(String[] args) { 
    Buttons m = new Buttons(); 
    } 

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

+0

Спасибо, это сработало! – user163505

+0

@ user163505 Хорошо, если этот ответ на ваш вопрос, то, пожалуйста, примите его, чтобы он мог быть закрыт. – porfiriopartida

0

С точки зрения ООП в это совсем немного странно, и не кажется правильным.

На мой взгляд, не следует создавать отдельный класс для этого, просто метод, внутри Main класса и передать ссылку на панели к нему:

public class Main extends JPanel{ 

    public Main(){ 

     Main m = new Main(); 

      //The main window 
      JFrame Main = new JFrame("Don't Blink"); 
      Main.setSize(500,500); 
      Main.setResizable(false); 
      Main.setVisible(true); 
      Main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      //The main window's panel 
      JPanel mainPanel = new JPanel(); //I want to add buttons to this panel from the Buttons class 
      mainPanel.setSize(500, 500); 
      mainPanel.setVisible(true); 
      Main.add(mainPanel); 

      addTheButtons(mainPanel); //this does the heavy lifting 
    } 

    private addTheButtons(JPanel mainPanel){ 

     //The button to get a job 
     JButton workButton = new JButton("Get a job"); 
     mainPanel.add(workButton); 

    } 
} 

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

0

Прежде всего, это плохая практика, чтобы назвать имя переменной с большой буквы, например Main. Используйте camelCase.

Пожалуйста, не используйте для этого наследование. Я рекомендую вам определить способ следующим образом:

private Container getButtonContainer() { 
    final JPanel buttonPanel = new JPanel(...); 

    ... 

    buttonPanel.add(button1); 
    buttonPanel.add(button2); 

    return buttonPanel; 
} 

Затем добавьте эту панель на главную панель.

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