2015-05-07 2 views
6

Я делаю игру в танк и избегаю избыточности. Я делаю классы для расширения. My MenuPanel выглядит следующим образом атм (я только написал код, который имеет значение для вопроса) (Кноп = голландец кнопки)Как использовать код из одного класса в другом? (Java)

public class MenuPanel extends JPanel implements ActionListener 
{ 

    private JButton playKnop, highScoreKnop, quitKnop, HTPKnop; 
    private ImageIcon play, HS, quit, HTP; 
    private Tanks mainVenster; 

    public MenuPanel(Tanks mainVenster) 
    { 
     this.mainVenster = mainVenster; 
     this.setLayout(null); 

     int x = 95; 
     int width = 200; 
     int height = 50;  


     play = new ImageIcon(PlayPanel.class.getResource(/buttons/PLAY.png)); 
     playKnop = new JButton(play); 
     playKnop.setBounds(x, y, width, height); 
     playKnop.addActionListener(this); 

     HS = new ImageIcon(PlayPanel.class.getResource(/buttons/HS.png)); 
     highScoreKnop = new JButton(HS); 
     highScoreKnop.setBounds(x, 460, width, height); 
     highScoreKnop.addActionListener(this); 

     HTP = new ImageIcon(PlayPanel.class.getResource(/buttons/HTP.png)); 
     HTPKnop = new JButton(HTP); 
     HTPKnop.setBounds(x, 515, width, height); 
     HTPKnop.addActionListener(this); 

     quit = new ImageIcon(PlayPanel.class.getResource(/buttons/QUIT.png)); 
     quitKnop = new JButton(quit); 
     quitKnop.setBounds(x, 570, width, height); 
     quitKnop.addActionListener(this); 

     this.add(playKnop); 
     this.add(quitKnop); 
     this.add(HTPKnop); 
     this.add(highScoreKnop); 

     validate(); 
    } 
} 

, так как код, чтобы сделать кнопки точно так же (за исключение для backgroundPath и у-координаты) Я сделал кнопку класса:

package menu; 

import java.awt.Image; 
import java.awt.event.ActionListener; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 

public class button 
{ 


    public JButton button; 
    public ImageIcon buttonImage; 

    public int x = 95; 
    public int width = 200; 
    public int height = 50; 

    public String backgroundPath; 
    public int y; 



    public button(String backgroundPath, int y) 
    { 
     this.backgroundPath = backgroundPath; 
     this.y = y; 

     buttonImage = new ImageIcon(PlayPanel.class.getResource(backgroundPath)); 
     button = new JButton(); 
     button.setBounds(x, y, width, height);; 
     button.addActionListener(this); 
    } 



} 

таким образом, мои menuPanel может выглядеть следующим образом:

package menu; 

    @SuppressWarnings("serial") 
    public class MenuPanel extends JPanel implements ActionListener 
    { 

    private button playKnop, highScoreKnop, quitKnop, HTPKnop; 
    private JTextField naam; 
    private Tanks mainVenster; 



    public MenuPanel(Tanks mainVenster) 
    { 
     this.mainVenster = mainVenster; 
     this.setLayout(null);  

     playKnop = new button("/buttons/PLAY.png", 350);   
     highScoreKnop = new button("/buttons/HS.png", 460); 
     quitKnop = new button("/buttons/QUIT.png", 515); 
     HTPKnop = new button("/buttons/HTP.png", 570); 


     this.add(playKnop); 
     this.add(quitKnop); 
     this.add(HTPKnop); 
     this.add(highScoreKnop); 


     validate(); 

    } 


} 

Я не знаю, почему, но когда я это сделаю, кнопки не появятся, хотя код из класса кнопок верен (bc, когда я использую код в самом меню панели).

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

Спасибо заранее, Lola

Спасибо всем большое! сочетание ваших ответов помогло мне отобразить кнопки, но по какой-то причине изображения не загружаются с ними. мой код теперь выглядит следующим образом:

общественный класс MenuPanel расширяет JPanel реализует ActionListener {

private Button playKnop, highScoreKnop, quitKnop, HTPKnop; 

private Tanks mainVenster; 

int x = 95, width = 200, height = 50; 

public MenuPanel(Tanks mainVenster) 
{ 
    this.mainVenster = mainVenster; 
    this.setLayout(null); 

    playKnop = new Button("/buttons/PLAY.png", 350, this);  
    highScoreKnop = new Button("/buttons/HS.png", 460, this); 
    quitKnop = new Button("/buttons/QUIT.png", 515, this); 
    HTPKnop = new Button("/buttons/HTP.png", 570, this); 

    this.add(playKnop); 
    this.add(quitKnop); 
    this.add(HTPKnop); 
    this.add(highScoreKnop); 

    validate(); 

} 

public class Button extends JButton 
{ 
    JButton button; 
    ImageIcon buttonImage; 

    String backgroundPath; 
    int y; 


    public Button(String backgroundPath, int y, MenuPanel menuPanel) 
    { 
     super(); 
     this.backgroundPath = backgroundPath; 
     this.y = y; 

     buttonImage = new ImageIcon(PlayPanel.class.getResource(backgroundPath)); 
     this.setBounds(x, y, width, height);; 
     this.addActionListener(menuPanel); 
    } 
} 

}

(все кнопки работают!)

ответ

1

Вы можете наблюдать разницу между line:

playKnop.addActionListener(this); 

и th е один в пожилом код:

playKnop = new button("/buttons/PLAY.png", 350); 

Я считаю, что вы хотите добавить MenuPanel как действие слушателя, но вы не передавая ссылку на него в более позднем коде. Вы скорее должны иметь: playKnop = new button("/buttons/PLAY.png", 350, this);

А затем установить эту ссылку в вашем Button классе, как:

public button(String backgroundPath, int y, MenuPanel menuPanel) 
    { 
     this.backgroundPath = backgroundPath; 
     this.y = y; 

     buttonImage = new ImageIcon(PlayPanel.class.getResource(backgroundPath)); 
     button = new JButton(); 
     button.setBounds(x, y, width, height);; 
     button.addActionListener(menuPanel); 
    } 
+0

Когда вы передаете 'this', вы фактически передаете ссылку на экземпляр этого класса, который является' MenuPanel' в вашем случае. Кстати, это решило вашу проблему? –

+0

Да, большое спасибо, мне очень помогла комбинация ответов, которые я получил. все работает, но у меня есть последний вопрос. Я хочу использовать этот код, это несколько панелей, поэтому мне нужен параметр для «MenuPanel menuPanel» в конструкторе. знаете ли вы, какой параметр я мог бы использовать? Я имею в виду разные панели, такие как «HighscorePanel» «PlayPanel» «HowToPlayPanel» «QuitPanel» .... – Lola

0

В существующем MenuPanel, когда вы делаете

this.add(playKnop); 

вы добавляете JButton к ваш JPanel

В новом MenuPanel Вы добавляете button в ваш JPanel.

Вам необходимо добавить JButton в JPanel.

Также выберите Button вместо button для имен классов.

Решение состоит в том, чтобы переписать этот код так, что вы добавляете JButton s, а не button s на свою панель. Могут быть и другие проблемы с кодом.

2

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

Теперь, для вашей реальной проблемы, первое, что выделяется для меня, это то, что ваш класс Button не расширяет ничего. Похоже, что для меня это не так, как на экране. я бы предложил сделать Button продлить JButton:

public class Button extends JButton { 
// Implementation Code 
} 

Это похоже на то, как ваш MenuPanel расширяет JPanel. JPanel не может отобразить пользовательский текст Button, который вы написали. Расширяя JButton он будет в состоянии сделать его, как он знает, как взаимодействовать с JButton

0

Существует разница в том, что вы добавляете. В новом коде вы добавляете экземпляры вашего класса button в JPanel. В старом коде вы добавили JButtons. buttons не может отображаться, поскольку они не являются качелями, старые JButtons могут.

Расширение кнопки от JButton должны сделать трюк:

public class button extends JButton { 

// public JButton button; // this line is depreceted now 

public ImageIcon buttonImage; 

... 

Кроме того, узнать о форматировании кода и стиль в Java. Это поможет вам написать более четкий код и предотвратить путаницы, как указано выше. Например. у вас есть класс с именем button с полем button и методом с именем button. Используйте разные имена как Button (классы всегда в верхнем регистре!), button и createButton.

0

Попробуйте добавить getButton в кнопке класса для возврата кнопки для добавления

public JButton getJButton(){ 
retun this.button 
} 

затем добавить использование этого при добавлении на панели меню

this.add(playKnop.getJButton()); 
0

Там нет ничего плохого с кодом. Единственная проблема, которую я вижу, заключается в том, что ваш класс button простирается на Object вместо JButton. Так просто сделать следующие изменения, и я чувствую, что это должно работать:

Вместо:

public class button 

записи

public class button extends JButton 
+0

Право это первый шаг. Но не забудьте изменить выполнение. вы можете удалить атрибут «кнопка», а затем изменить все вызовы функций на кнопке с помощью кнопки .setBounds (x, y, width, height); to this.setBounds (x, y, width, height); – morgelo

+0

дорогой downvoter, можете ли вы прокомментировать, почему и где мой ответ неверен? – Blip

0

Может быть, вы хотите, чтобы ваш класс кнопки наследуют JButton вместо того, чтобы кнопка поле. Таким образом, вы можете добавить кнопку на панель.

1

Разница в том, что вы больше не добавляете JButtons в JPanel.

Для того, чтобы этот код работал, ваш класс «кнопка» должен расширять JPanel.

Другой способ извлечь общий код будет создать «Button метод создателя» вместо класса, что-то вроде:

public class MenuPanel extends JPanel implements ActionListener 
{ 
    int y = 95, width = 200, height = 50; 
    private JButton playKnop, highScoreKnop, quitKnop, HTPKnop; 

    public MenuPanel() 
    { 
     this.setLayout(null); 

     playKnop = createButton("/buttons/PLAY.png", 350); 
     highScoreKnop = createButton("/buttons/HS.png", 460); 
     quitKnop = createButton("/buttons/QUIT.png", 515); 
     HTPKnop = createButton("/buttons/HTP.png", 570); 

     this.add(playKnop); 
     this.add(quitKnop); 
     this.add(HTPKnop); 
     this.add(highScoreKnop); 

     validate(); 
    } 

    private JButton createButton(String path, int x) { 
     ImageIcon icon = new ImageIcon(MenuPanel.class.getResource(path)); 
     JButton button = new JButton(icon); 
     button.setBounds(x, y, width, height); 
     button.addActionListener(this); 
     return button; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    } 
} 
2

Я думаю, что вы можете лучше пусть ваш класс Button продлить JButton. Таким образом, вы можете просто добавить свой собственный класс кнопки в menupanel.

public class Button extends JButton 
{ 


    public JButton button; 
    public ImageIcon buttonImage; 

    public int x = 95; 
    public int width = 200; 
    public int height = 50; 

    public String backgroundPath; 
    public int y; 



    public Button(String backgroundPath, int y, MenuPanel menuPanel) 
    { 
     super() 
     this.backgroundPath = backgroundPath; 
     this.y = y; 

     buttonImage = new ImageIcon(PlayPanel.class.getResource(backgroundPath)); 
     this.setBounds(x, y, width, height);; 
     this.addActionListener(menuPanel); 
    } 



} 
0

Я не очень хорошо знаком с классом JButton. Вам нужно установить buttonImage в качестве фона. Может быть, есть некоторые функции, как:

this.setBackground(buttonImage); 

Если нет функции Лика это, вы можете установить фон в конструкторе. Как и в приведенных выше примерах. Вы всегда создавали новую кнопку с:

JButton b = new JButton(buttonImage); 

Вы можете дать те же параметры для супер() - Methode в собственном Конструктора. Результат будет выглядеть следующим образом:

public class Button extends JButton 
{ 
    String backgroundPath; 
    int y; 

    public Button(String backgroundPath, int y, MenuPanel menuPanel) 
    { 
     super(new ImageIcon(PlayPanel.class.getResource(backgroundPath))); 
     this.backgroundPath = backgroundPath; 
     this.y = y; 

     this.setBounds(x, y, width, height); 
     this.addActionListener(menuPanel); 
    } 
} 

Этот код не проверен.

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