2017-05-14 61 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)作为您在该方法中做的最后一件事。