JFrame和JPanels

时间:2016-12-23 18:41:42

标签: java swing jframe jpanel

我正在制作一个GUI,它允许我选择几个选项中的一个,它们有更多选项(按钮)。我对Java缺乏经验并且遇到了一些问题。

点击this.dispose()后,为什么JPanel无法打开新的Button11?我如何准确地JPanel打开新Panel11?你能给我一些建议吗?

class Panel1 extends JPanel
{
private Frame frame;
private JButton backButton;
private JButton Button11;
private JButton Button12;
private JButton Button13;

public Panel1(Frame f)
{
frame=f;

setPreferredSize(new Dimension(500,500));
backButton=new JButton("Back");
Button11=new JButton("Z warunkami atmosferycznymi");
Button12=new JButton("Z kontrolą ruchu lotniczego");
Button13=new JButton("Z uszkodzeniem/awarią");

add(new JLabel("Podczas lotu"));
add(backButton);
add(Button11);
add(Button12);
add(Button13);

backButton.addActionListener( new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e){
    frame.back(); }
                              }
);

Button11.addActionListener( new ActionListener () {
    public void actionPerformed(ActionEvent e) {
    Panel11 panel = new Panel11();
    panel.setVisible(true);
    panel.setLocationRelativeTo(null);
    this.dispose();
       }
}
);
    }
}

class Panel11 extends JPanel
{

private Frame frame;
private JButton backButton;

public Panel11(Frame f)
{
frame=f;

setPreferredSize(new Dimension(200,500));
backButton=new JButton("Back");
add(new JLabel("Podczas rotacji"));
add(backButton);
backButton.addActionListener( new ActionListener()
                              {
                                @Override
                              public void actionPerformed(ActionEvent e)
                                {
                                  frame.back();
                                }
                              }
 );  
}
}

class Frame extends JFrame
{

private JPanel main;
private JButton button1;
private Panel1 panel1;


public Frame()
{
super("Algorytm przydziału kodów opóźnień");

main=new JPanel();
main.setPreferredSize(new Dimension(400,200));
panel1=new Panel1(this);

button1=new JButton("Podczas lotu");
button1.addActionListener(new ActionListener()
                          {
                            @Override
                            public void actionPerformed(ActionEvent e)
                            {
                              update(panel1);
                            }
                          }
);

main.add(button1);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(main);
pack();
setResizable(true);
setVisible(true);
}

public void back()
{
update(main);
}

private void update(JPanel panel)
{
remove(panel1);
remove(main);
add(panel);
pack();
panel.setVisible(true);
setVisible(true);
}
}


public class Main
{
public static void main(String[] args)
{
new Frame();
}
}    

1 个答案:

答案 0 :(得分:2)

您的错误是因为您正在致电:

Panel11 panel = new Panel11();

现在,让我们看看Panel11的构造函数:

public Panel11(Frame f)
public Panel11()

你觉得有什么不同吗?是的,我知道,你从未写过public Panel11(),但默认情况下它就在那里,所以,你正在调用它并且它是空的,所以,你需要传递{{1}引用它,同时确保将其更改为Frame而不是JFrame,因为Frame属于AWT而Frame属于Swing。

您会发现使用正确的代码缩进,接下来就是,您使用多个JFrame,请参阅The use of multiple JFrames, Good / Bad practice?(BAD!),而您可能希望使用{{ 3}}或Card Layout

如果这没有帮助,请发布有效的Dialogs