单击来自不同类的按钮时更新JFrame

时间:2014-04-10 03:24:33

标签: java swing jframe actionlistener dispose

目前,在尝试使用新信息更新我的JFrame时遇到了一个重大问题。 我尝试了通常的无效,验证,重绘等等。

以下是创建JFrame的主要代码:

package Calendar;

import javax.swing.*;
import java.awt.*;
import java.util.GregorianCalendar;
import java.awt.Frame;

public class Main extends JFrame
{


    public Main()
    {

    }

    public void makeFrame()
    {
        JFrame frame = new JFrame("Programming II Project: Calendar");

        setLayout(new BorderLayout(0, 5));

        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setMinimumSize(new Dimension(640, 384));
    }

    public void makeCenter(int year, int month)
    {
        // Add center
        //new JFrame();
        //this.setVisible(true);
        JPanel p = new JPanel(new BorderLayout());
        p.add(calendarPanel.makeCalendar(year, month));
        add(p, BorderLayout.CENTER);
        System.out.println("----- FRAME WINDOWS -----");
        Frame[] frames = Frame.getFrames();
        for (Frame frame : frames)
            System.out.println(frame.getName() + ": " + frame.getClass());

        //this.setMinimumSize(new Dimension(512, 384));
    }



    public void makeEast()
    {
        JPanel p = new JPanel(new BorderLayout());
        Clock myClock = new Clock();
        p.add(myClock);
        p.setForeground(Color.red);
        this.add(p, BorderLayout.EAST);
    }

    public void makeNorth()
    {
        // Add north
        northPanel np = new northPanel();
        this.add(np, BorderLayout.NORTH);
    }

    public static void main(String[] args)
    {

        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch (ClassNotFoundException e)
        {
            System.out.println("ClassNotFoundException");
        }
        catch (InstantiationException e)
        {
            System.out.println("InstantiationException");
        }
        catch (IllegalAccessException e)
        {
            System.out.println("IllegalAccessException");
        }
        catch (UnsupportedLookAndFeelException e)
        {
            System.out.println("UnsupportedLookAndFeelException");
        }

        Main m = new Main();
        m.makeFrame();
        m.makeCenter(GregorianCalendar.YEAR, GregorianCalendar.MONTH);
        m.makeNorth();
        m.makeEast();
        m.setVisible(true);
    }
}

这是用于切换JFrame的按钮代码: 这是一个完全不同的类

static class bNextMonth_Method implements ActionListener{
    public void actionPerformed (ActionEvent e)
    {
        if (clickm == 11)
        {
            clicky = clicky + 1;
            clickm = 0;
            System.out.println(clickm);
            System.out.println(clicky);
            Main m = new Main();
            m.makeCenter(clicky, clickm);
            m.makeNorth();
            m.makeEast();
        }
        else
        {
            clickm = clickm + 1;
            System.out.println(clickm);
            System.out.println(clicky);
            Main m = new Main();
            m.makeCenter(clicky, clickm);
            m.makeNorth();
            m.makeEast();
        }
    }
}

现在你会注意到在makeCenter方法的第一段代码中注释掉了东西。如果我取消评论信息的变化,但每次都会创建一个新窗口。

现在即使当前没有dispose(),我把它放在makeCenter方法中,因为那是从按钮调用的。我可以说按钮工作正常,因为

System.out.println(" ----- FRAME WINDOWS -----");

每次点击都会更新并列出一个新框架。

必须有一些非常简单的东西。

另外我想说我在这里留下了另一个名为Clock.java的课程。

这确实有一个计时器,但我不确定这是否会中断任何事情。

编辑:我想这就是你的意思?

 public class bNextMonth_Method implements ActionListener{
    private Main main;

    public bNextMonth_Method(Main main) {
        this.main = main;
    }
    public void actionPerformed (ActionEvent e)
    {
        if (clickm == 11)
        {
            clicky = clicky + 1;
            clickm = 0;
            System.out.println(clickm);
            System.out.println(clicky);
            main.makeCenter(clicky, clickm);
            main.makeNorth();
            main.makeEast();
        }
        else
        {
            clickm = clickm + 1;
            System.out.println(clickm);
            System.out.println(clicky);
            Main m = new Main();
            main.makeCenter(clicky, clickm);
            main.makeNorth();
            main.makeEast();
        }
    }
}

这是我最好的解释,但是抛出

bNextYear_Method中的

bNextYear_Method(Main)无法应用于()

现在我知道这意味着什么,但我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

看看你在ActionListener中使用Main做了什么 - 你正在创建一个完全 new ,并在此方法中创建不同的Main!

public void actionPerformed (ActionEvent e)
{
    if (clickm == 11)
    {
        clicky = clicky + 1;
        clickm = 0;
        System.out.println(clickm);
        System.out.println(clicky);
        Main m = new Main();   // ********* here **************
        m.makeCenter(clicky, clickm);
        m.makeNorth();
        m.makeEast();
    }

此主要与正在显示的主要内容无关。对此新创建的主对象的状态所做的任何更改都将反映在显示的主对象中,因为它们是完全不同的唯一对象。

解决方案:不要这样做。将对 real Main对象的有效引用传递给侦听器并在其上调用方法。

public class MyListener implements ActionListener {
  private Main main;

  public MyListener(Main main) {
    this.main = main;
  }

  public void actionPerformed(ActionEvent e) {
     // now in here we can call methods on the main variable
     // and it will be called on the actual displayed main
  }
}

修改

现在,当您调用侦听器的构造函数时,必须将正确的参数传递给它。还请求学习并遵循Java命名约定。所有类名都应以大写字母开头。