我不久前開始通過教程和視頻學習 Java,在了解了一些東西(按鈕、布局、音頻和其他一些東西的作業原理)之后,我現在的目標之一是創建一個小的互動式游戲。
我在 Main Class 中撰寫了游戲的很大一部分,它運行良好,但一段時間后變得混亂。
所以我決定從頭開始嘗試對游戲的每個部分使用不同的類,以使代碼看起來更清晰易懂。
但是我從一開始就遇到了一個問題,經過幾個小時的教程和論壇上的搜索,并沒有找到準確的答案,我認為如果您能準確地看到我的問題(這非常簡單!)
- 所以我只是在一個類中構建了 JFrame(我只使用主類來啟動框架,它作業正常):
import javax.swing.*;
import java.awt.*;
public class principalFrame {
public principalFrame(){
JFrame mainFrame = new JFrame();
mainFrame.setVisible(true);
mainFrame.setSize(1200,750);
mainFrame.getContentPane().setBackground(Color.BLACK);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setResizable(false);
}
}
我在另一個類中創建了一個 JPanel :
import javax.swing.*;
import java.awt.*;
public class mainMenu{
public mainMenu(){
JPanel menuPanel = new JPanel();
menuPanel.setSize(300,300);
menuPanel.setBackground(Color.BLUE);
}
}
我的目標是在 JFrame 中添加 JPanel。而且......我不明白該怎么做。
我試圖將 menuPanel 類添加為 mainFrame 類中的一個物件,這樣我就可以添加 JPanel,但它不起作用。然后從我閱讀的舊問題中嘗試了一系列其他解決方案,但沒有任何真正幫助我。
PS:我知道我沒有在此處的代碼中添加任何布局管理器或任何其他內容,因為我想讓問題的代碼非常簡單。
uj5u.com熱心網友回復:
所以如果你想為 mainMenu 創建一個單獨的類,你應該讓它擴展 JPanel。這樣,您的 mainFrame 類就可以實體化它。
下面是我要告訴你的關于我在構建 Swing 的程序中學到的經驗教訓:
您(幾乎)從不需要單獨的類來創建 JFrame。如果您創建一個擴展 JPanel 的類,那么在靜態方法(如 main)中創建一個 JFrame 來放置您的 JPanel 就很容易了。話雖如此,如果您還想使用 JLayeredPane 或想在JMenuBar,可能存在子類化 JFrame 的情況。不繼承 JFrame的優點是可以更輕松地將 JPanel 粘貼到 JFrame、JDialog(通過 JOptionPane)或 JWindow 中。
除非您有一個您認為可能在其他應用程式中有用的組件,否則您應該在一個類中構建整個 GUI,并使用該類作為
Controller. 可以在其他應用程式中使用的組件的示例是什么?回到當天,我制作了一個“ColorButton”擺動類,用于顏色選擇。這個組件有一個獨立的模型,有自己的控制器和一個 API 來獲取選擇的顏色。(https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/ex/)使其可重復使用。但通常情況下,您正在構建的 GUI 元素在您在該類中所做的作業之外并不能真正重用。
話雖如此,對于您在上面發布的代碼:您的 mainMenu JPanel 在課程外無法訪問,因此這可能是一個問題。正如我在上面的段落中所說的,如果您不確定您正在創建的組件是否可以在其他地方使用,最好將整個view 和model構建放在與組件相同的類中controller
uj5u.com熱心網友回復:
你很接近。你必須能夠JPanel從MainMenu課堂上獲得。
JFrame必須按特定順序呼叫這些方法。這是我用于 Swing 應用程式的順序。
類名以大寫字符開頭。
這是您可以對MainMenu類進行編碼的一種方法。
public class PrincipalFrame {
public PrincipalFrame() {
JFrame mainFrame = new JFrame();
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.add(new MainMenu().getMenuPanel(), BorderLayout.CENTER);
mainFrame.setSize(1200, 750);
mainFrame.setResizable(false);
mainFrame.setVisible(true);
}
}
public class MainMenu {
private final JPanel menuPanel;
public MainMenu() {
this.menuPanel = new JPanel();
this.menuPanel.setPreferredSize(300, 300);
this.menuPanel.setBackground(Color.BLUE);
}
public JPanel getMenuPanel() {
return menuPanel;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/360479.html
上一篇:如何列印一疊卡片?
