【问题标题】:Update JFrame when button from different class is clicked单击不同类的按钮时更新 JFrame
【发布时间】:2014-04-10 03:24:32
【问题描述】:

目前我在尝试使用新信息更新我的 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("----- 框架窗口-----");

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

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

我还想说,我在这里遗漏了另一个名为 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)不能应用于()

现在我知道这意味着什么,但我该如何解决呢?

【问题讨论】:

  • 让我们从The Use of Multiple JFrames, Good/Bad Practice? 开始,然后转到public class Main extends JFrame,但随后makeFrame 正在以任何方式创建它自己的JFrame...我会说你正在失去任何想法实际引用了什么

标签: java swing jframe actionlistener dispose


【解决方案1】:

看看你在 ActionListener 内部对 Main 做了什么——你在这个方法内部创建了一个完全和不同的 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();
    }

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

解决方案:不要这样做。将对 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 命名约定。所有类名都应以大写字母开头。

【讨论】:

  • 我想我明白了你的意思。我在顶部添加了更多内容。
猜你喜欢
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多