当前位置: 首页 > 知识库问答 >
问题:

当点击不同类的按钮时更新JFrame

曹凯泽
2023-03-14

目前,我在尝试用新信息更新我的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方法中,因为这是从按钮调用的。我可以看出按钮工作正常,因为

ystem.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\u方法中的bNextYear\u方法(Main)不能应用于()

现在我知道这意味着什么,但我该如何着手修复它呢?

共有1个答案

郭琨
2023-03-14

看看你在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对象的状态所做的任何更改都不会反映在显示的对象中,因为它们是完全不同的唯一对象。

解决方案:不要这样做。将对真实主对象的有效引用传递给侦听器,并对其调用方法。

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命名约定。所有类名都应以大写字母开头。

 类似资料:
  • 我正在使用和这里找到的自定义表模型。我已经用那篇文章中提供的建议更新了我的代码,遇到了一个新问题。我对代码所做的更改是注入<code>ArrayList 用于初始化< code>JTable的代码如下: 我用来更新< code>JTable的代码如下: 我也尝试过使用但这也不起作用。截至目前,使更新的唯一方法是关闭并重新打开程序。具有我用于的,随着用户添加更多玩家,其大小会增加。 为什么< cod

  • 我能找到的每个更改按钮图像的示例都显示了当单击该按钮时如何更改它。但是我如何点击一个切换按钮,并让它改变一个常规按钮的图像呢? 关于更多细节,我有两个按钮和一个onCheckedChanged事件: 当按下切换按钮并发生onCheckedChanged事件时,我需要将btn1的背景设置为新图像。

  • 我正在尝试在React中构建我的第一个计算器。我的纽扣似乎有问题(我想)。在测试s时,我发现我第一次点击添加按钮不会更新所有setState。相反,第二次单击会正确更新它。 知道它为什么不起作用吗? 我有一个名为“DaInserting”的div,当用户点击任何数字键时会更新,然后当用户点击加法/减法/等时,应该更新,但它没有。它在第二次点击时更新:-检查。 当用户点击加法/减法后,DaInser

  • 问题内容: 我正在使用此处找到的自定义表格模型。我已经使用该帖子中提供的建议更新了我的代码,并遇到了一个新问题。我对我的代码所做的改变是一个注入到我,以避免与线程的问题。完成此操作后,通过按按钮更新我的表的代码已停止工作。 用于初始化的代码如下: 我用来更新的代码如下: 我也尝试过使用,但这也不起作用。截至目前,更新的唯一方法是关闭并重新打开程序。具有我正在使用的,随着用户添加更多玩家,尺寸会增加

  • 我在这里使用来制作一个UI应用程序。我创建了一个JFrame,带有一些按钮。当我点击这个按钮时,我想要一个新的JFrame,在这里有一些不同的内容。但是,我不想在这里加载新的JFrame。 我知道的一种方法是在第一个JFrame中的按钮的方法中将第二个JFrame的可视化设置为True。但是它再次加载了一个新的JFrame,我不希望这样。 我只想要一个JFrame,当我们点击不同的按钮时,它的内容

  • 问题内容: 可以更改按钮功能吗? 例如 点击,再点击一次 我已经尝试过类似,但没有结果。 我设法使叠加工作并在其中插入所需的数据。但是没有找到任何可以帮助我的帖子。我正在使用react-bootstrap。这是我的代码。 问题答案: 您可以尝试使用状态来存储颜色。也许这会让您想到解决问题的方法: 这是一个小提琴。