2015-05-07 20 views
6

Tôi đang làm một trò chơi xe tăng và để tránh sự thừa tôi đang làm cho các lớp học để mở rộng. My MenuPanel trông giống như atm này (Tôi chỉ viết mã mà mang đầy đủ các câu hỏi) (Knop = dutch cho nút)Cách sử dụng mã từ lớp này sang lớp khác? (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(); 
    } 
} 

vì mã để làm cho các nút là giống hệt nhau (trừ cho backgroundPath và y phối hợp) tôi đã thực hiện một nút lớp:

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); 
    } 



} 

theo cách đó, menuPanel tôi có thể nhìn như thế này:

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(); 

    } 


} 

Tôi không biết tại sao, nhưng khi tôi làm điều này các nút sẽ không xuất hiện, mặc dù mã từ lớp nút là chính xác (bc khi tôi sử dụng mã trong menuPanel chính nó hoạt động)

I don 't biết làm thế nào để khắc phục vấn đề này và tôi có nhiều vấn đề như thế này trong toàn bộ JavaProject của tôi, nhưng nếu ai đó có thể giải thích cho tôi làm thế nào để sửa lỗi này tôi có thể thoát khỏi tất cả các dự phòng trong dự án của tôi.

Cảm ơn trước, Lola

Cảm ơn tất cả các bạn rất nhiều! sự kết hợp các câu trả lời của bạn đã giúp tôi cho phép các nút xuất hiện, nhưng vì một số lý do khiến hình ảnh không tải với chúng. mã của tôi bây giờ trông giống như:

public class MenuPanel kéo dài JPanel thực hiện 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); 
    } 
} 

}

(tất cả các nút làm việc!)

Trả lời

1

Bạn có thể quan sát sự khác biệt giữa dòng:

playKnop.addActionListener(this); 

và thứ một e trong mã sau:

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

Tôi tin rằng bạn muốn thêm MenuPanel như người nghe hành động nhưng bạn không đi qua các tham chiếu đến nó trong mã sau. Bạn chứ không nên có: playKnop = new button("/buttons/PLAY.png", 350, this);

Và sau đó thiết lập thông tin này trong lớp Button của bạn như:

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

Khi bạn vượt qua 'this' bạn thực sự chuyển một tham chiếu đến cá thể của Lớp đó là' MenuPanel' trong trường hợp của bạn. Bằng cách này nó đã giải quyết vấn đề của bạn? –

+0

vâng cảm ơn bạn rất nhiều, sự kết hợp các câu trả lời tôi nhận được đã giúp tôi rất nhiều. mọi thứ đều hiệu quả nhưng tôi có một câu hỏi cuối cùng. tôi muốn sử dụng mã này là nhiều bảng vì vậy tôi cần một tham số cho 'MenuPanel menuPanel' trong constructor. bạn có biết thông số nào tôi có thể sử dụng không? i có nghĩa là các bảng khác nhau như 'HighscorePanel' 'PlayPanel' 'HowToPlayPanel' 'QuitPanel' .... – Lola

0

Trong MenuPanel hiện có, khi bạn làm

this.add(playKnop); 

bạn đang thêm một JButton để của bạn JPanel

Trongmớibạn đang thêm button vào số JPanel của mình.

Bạn cần thêm JButton vào JPanel.

Đồng thời chọn Button thay vì button cho tên lớp học.

Giải pháp là viết lại mã này để bạn thêm JButton s thay vì button giây vào bảng điều khiển của mình. Có thể có các vấn đề khác với mã quá.

2

Thứ nhất, tất cả các tên lớp nên bắt đầu bằng chữ cái viết hoa làm quy ước, điều này không ảnh hưởng đến việc biên dịch nhưng là thực hành tốt.

Bây giờ, đối với vấn đề thực tế của bạn, điều đầu tiên nổi bật với tôi là Lớp học Button của bạn không mở rộng bất cứ điều gì. Điều này với tôi có vẻ là lý do tại sao nó không xuất hiện trên màn hình. tôi sẽ đề nghị làm Button mở rộng JButton:

public class Button extends JButton { 
// Implementation Code 
} 

này cũng tương tự như cách MenuPanel của bạn kéo dài JPanel. JPanel không thể hiển thị tùy chỉnh Button mà bạn đã viết. Bằng cách mở rộng JButton nó sẽ có thể làm cho nó vì nó biết làm thế nào để tương tác với một JButton

0

Có sự khác biệt đến những gì bạn đang thêm. Trong mã mới, bạn thêm các thể hiện của lớp button vào JPanel. Trong mã cũ bạn đã thêm JButtons. buttons không thể hiển thị vì chúng không phải là các lớp swing, JButton cũ có thể.

Mở rộng nút từ JButton nên làm các trick:

public class button extends JButton { 

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

public ImageIcon buttonImage; 

... 

Ngoài ra, tìm hiểu về định dạng mã và phong cách trong Java. Điều này sẽ giúp bạn viết mã rõ ràng hơn và tránh nhầm lẫn như trên. Ví dụ. bạn có một lớp có tên là button với một trường có tên là button và một phương thức có tên là button. Sử dụng các tên khác nhau là Button (các lớp luôn là chữ hoa!), buttoncreateButton.

0

Hãy thử thêm một getButton trong nút lớp để trả lại nút để thêm

public JButton getJButton(){ 
retun this.button 
} 

sau đó thêm sử dụng này về việc bổ sung trên bảng điều khiển đơn

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

Không có gì sai với mã của bạn là. Vấn đề duy nhất mà tôi có thể thấy là Lớp của bạn button mở rộng Object thay vì JButton. Vì vậy, chỉ làm thay đổi sau đây và tôi cảm thấy nó nên làm việc:

Thay vì:

public class button 

ghi

public class button extends JButton 
+0

Đây là bước đầu tiên. Nhưng đừng quên thay đổi implemantation. bạn có thể loại bỏ các thuộc tính "nút" và sau đó thay đổi tất cả các cuộc gọi chức năng trên nút từ button.setBounds (x, y, chiều rộng, chiều cao); đến this.setBounds (x, y, chiều rộng, chiều cao); – morgelo

+0

downvoter thân yêu bạn có thể bình luận về lý do tại sao hoặc nơi câu trả lời của tôi là không chính xác? – Blip

0

Có lẽ bạn muốn chắc lớp nút bấm của bạn kế thừa JButton thay vì giữ một nút cánh đồng. Bằng cách đó, bạn có thể thêm nút vào bảng điều khiển.

1

Sự khác biệt là bạn không còn thêm JButton vào JPanel nữa.

Để mã này hoạt động, lớp "nút" của bạn phải mở rộng JPanel.

Một cách khác để trích xuất mã chia sẻ sẽ là để tạo ra một "phương pháp nút tạo" thay vì một lớp học, một cái gì đó như:

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

Tôi nghĩ rằng bạn có thể cho tốt hơn lớp Button của bạn mở rộng JButton. Bằng cách đó bạn chỉ có thể thêm lớp nút của riêng bạn vào 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

Tôi không quen thuộc với lớp JButton. Bạn cần đặt buttonImage làm nền. Có thể có một số chức năng như:

this.setBackground(buttonImage); 

Nếu không có chức năng, bạn có thể đặt nền trong Constructor. Tương tự như ví dụ của bạn ở trên. Bạn luôn tạo ra một nút mới với:

JButton b = new JButton(buttonImage); 

Bạn có thể cung cấp cho các thông số tương tự với siêu() - tole trong Constructor của riêng bạn. Kết quả sẽ trông như thế này:

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); 
    } 
} 

Mã này không được kiểm tra.

Các vấn đề liên quan