【问题标题】:make other class frame setvisible(false) when button pressed按下按钮时使其他类框架设置可见(假)
【发布时间】:2012-11-20 00:30:58
【问题描述】:

我想在按下按钮时设置其他类框架 setvisible(false)。

有一个名为 DisplayScore 的类,该类获取 getContentPane().add(new ScoreInfo());来自 ScoreInfo 类。 分成两类的原因是因为 DisplayScore 扩展了 JFrame 和 ScoreInfo 扩展了 JPanel。 反正

在 ScoreInfo 中按下按钮时,我想调用其他框架并关闭 DisplayScore 框架。如果我这样做了 this.setVisible(false);,只有 Panel 消失,而由 DisplayScore() 组成的框架仍然存在。

所以..我的问题是如何从 ScoreInfo 类中处理它? 查看底部部分。 actionPerformed 方法。

public class ScoreInfo extends JPanel implements ActionListener
{
        JButton btnBack;

public ScoreInfo()
{


    JTextArea ta = new JTextArea();
    ta.setForeground(Color.white);
    ta.setFont(new Font("Serif", Font.ITALIC+Font.BOLD, 16));
    ta.setBackground(Color.darkGray);

    try
    {
        ta.read(new FileReader("data/scores4.txt"),null);
    }
    catch(IOException ioe)
    {
        System.out.print("ERROR: Could not read file \"");
    }


    btnBack = new JButton("MAIN");
    btnBack.setSize(10,10);
    btnBack.setBackground(Color.darkGray);
    btnBack.setFont(new Font("Courier New", Font.ITALIC+Font.BOLD, 15));
    btnBack.setForeground(Color.black);

    JPanel score = new JPanel();
    score.setLayout(new BorderLayout());
    JButton btnScore = new JButton("H I G H  S C O R E");
    btnScore.setBackground(Color.BLACK);
    btnScore.setFont(new Font("Courier New", Font.ITALIC+Font.BOLD, 48));
    btnScore.setForeground(Color.white);

    JLabel score_tab = new JLabel("   N A M E  " + "  S C O R E  " + "  C O M B O  ");
    score_tab.setFont(new Font("Courier New", Font.ITALIC+Font.BOLD, 35));


    score.add(btnBack, BorderLayout.WEST);
    score.add(btnScore, BorderLayout.CENTER);
    score.add(score_tab, BorderLayout.SOUTH);

    JPanel panel = new JPanel();
    panel.setBackground(Color.darkGray);
    panel.setPreferredSize(new Dimension(800, 380));
    panel.setLayout(new BorderLayout());
    panel.add(score, BorderLayout.NORTH);
    //panel.add(backpnl, BorderLayout.WEST);
    panel.add(ta, BorderLayout.CENTER);

    add(panel, score);

    btnBack.addActionListener(this);

    }

public void actionPerformed(ActionEvent evt){
    if(evt.getSource()==btnBack){

        //want to make DisplayScore.setVisible(false); 
        //this.setVisible(false);
        MainFrame mf = new MainFrame();
        mf.pack();
        mf.setSize(640,480);
        mf.setLocation(400,0);
        mf.setResizable(false);
        mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mf.setVisible(true);

    }
}

}

【问题讨论】:

  • 1) 参见The Use of Multiple JFrames, Good/Bad Practice? 2) 弹出式GUI 最好使用JDialogJOptionPane。 3) “因为 DisplayScore 扩展了 JFrame..” 不要扩展框架。 "..and ScoreInfo extends JPanel" ..or 面板。相反,只需创建一个并向其添加内容。

标签: java swing jframe jpanel


【解决方案1】:

你可以:

【讨论】:

    【解决方案2】:

    这应该有效:

    if(evt.getSource()==btnBack){
    
        getParent.setVisible(false);
        MainFrame mf = new MainFrame();
    

    但不是太健壮,因为您不知道父级是否实际上是JFrame(正如 MadProgrammer 评论的那样,这将是 contentPane,所以这不起作用)。更好的方法是在构造函数中请求JFrame,并隐藏它。

    【讨论】:

    • getParent 可能是JFrame(或JDialog)的内容窗格
    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 2011-09-02
    • 2012-02-11
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2013-05-15
    • 2016-10-20
    相关资源
    最近更新 更多