2017-05-14 82 views
0

我剛剛接觸過Java,並且正在爲我的大學班級開發一個項目。 我正在參加Milionaire遊戲,但我卡住了。使用另一個jPanel上的按鈕修改jPanel

我有一個JFrame類,其中有2個面板。第一個是由按鈕組成的,第二個是我想通過按下按鈕改變的面板。按鈕有自己的類與他們的構造函數和相同的面板導致他們有不同的佈局。我需要在按鈕類中創建一個方法,以從框架中移除第二個面板並添加第三個面板(在另一個JPanel類中進行介紹)。所以我在技術上需要從按鈕類方法到我的JFrame類構造函數。有沒有辦法做到這一點?

我有我的第一個Panel類和我的Button類的ClickListener方法。 現在我需要知道如何在我的Button方法中修改我的JFrame類,以便在單擊時關閉第一個面板,並在同一位置打開另一個面板。

按鍵法

​​

主要JFrame類

package nuovaPartita; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

/** 
* Visualizza la finestra di gioco. 
*/ 
public class NuovaPartitaViewer extends JFrame 
{ 
    private static final int FRAME_LUNGH = 1600; 
    private static final int FRAME_ALT = 900; 

    JPanel panel1 = new NuovaPartitaComp1(); 
    JPanel panel2 = new Start(); 
    /** 
    * Costruisce una finestra di gioco su cui vengono visualizzati due 
pannelli. 
    */ 
    public NuovaPartitaViewer() 
    { 
     setSize(FRAME_LUNGH, FRAME_ALT); 
     setTitle("CHI VUOL ESSER MILIONARIO?"); 
     setVisible(true); 
     setLocationRelativeTo(null); 
     setResizable(false); 

     BorderLayout layout = new BorderLayout(); 
     getContentPane().setLayout(layout); 
     getContentPane().setBackground(Color.BLACK); 
     add(panel1, BorderLayout.WEST); 
     add(panel2, BorderLayout.CENTER); 
    } 
} 

感謝

+1

「_I需要用另一個面板上的按鈕單擊來創建一個新的JPanel來代替它......」您可以將其描述一下嗎?似乎不清楚。 – progyammer

+0

當然可以!我很抱歉第一次使用stackoverflow。 我有一個JFrame類,我有2個面板。第一個是由按鈕組成的,第二個是我想通過按下按鈕改變的面板。 按鈕有自己的類與他們的構造函數和相同的面板導致他們有不同的佈局。 我需要在按鈕類中創建一個方法來從框架中刪除第二個面板並添加第三個面板(在另一個更多JPanel類中進行了介紹)。 所以我在技術上需要從按鈕類方法到我的JFrame類構造函數。 有沒有辦法做到這一點? –

+0

您可以在您的JFrame中實現您的監聽器,然後您可以訪問jFrame及其所有內容 – 2017-05-14 15:58:08

回答

0

只需將對應於該按鈕的動作偵聽器的按鈕面板。

enter image description here

public class NuovaPartitaViewer extends JFrame { 

    public NuovaPartitaViewer() { 
     JPanel p1 = new JPanel(); 
     p1.add(new JLabel("Panel 1")); 
     JPanel p2 = new JPanel(); 
     p2.add(new JLabel("Panel 2")); 
     JPanel p3 = new JPanel(); 
     p3.add(new JLabel("Panel 3")); 
     JPanel p4 = new JPanel(); 
     p4.add(new JLabel("Panel 4")); 

     JButton b1 = new JButton("Button 1"); 
     b1.addActionListener(e -> setPanel(p1)); 
     JButton b2 = new JButton("Button 2"); 
     b2.addActionListener(e -> setPanel(p2)); 
     JButton b3 = new JButton("Button 3"); 
     b3.addActionListener(e -> setPanel(p3)); 
     JButton b4 = new JButton("Button 4"); 
     b4.addActionListener(e -> setPanel(p4)); 

     JPanel buttonsPanel = new JPanel(new GridLayout(2, 2)); 
     buttonsPanel.add(b1); 
     buttonsPanel.add(b2); 
     buttonsPanel.add(b3); 
     buttonsPanel.add(b4); 

     BorderLayout layout = new BorderLayout(); 
     getContentPane().setLayout(layout); 
     getContentPane().setBackground(Color.BLACK); 
     add(buttonsPanel, BorderLayout.WEST); 
     add(p1, BorderLayout.CENTER); 

     setTitle("CHI VUOL ESSER MILIONARIO?"); 
     pack(); 
     setLocationRelativeTo(null); 
     setResizable(false); 
     setVisible(true); 
    } 

    private void setPanel(JPanel p) { 
     add(p, BorderLayout.CENTER); 
     revalidate(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> new NuovaPartitaViewer()); 
    } 
} 

如果你所有的按鈕都定製(extends JButton),那麼你可以在類直接添加動作監聽器代碼。在構造函數中傳遞相應的JPanel,以便您可以在動作偵聽器中使用它。

此外:

  • 不要設置框的大小,使用pack()代替。
  • 致電setVisible(true)作爲您在該方法中做的最後一件事。