【问题标题】:repaint() method does not paint new framerepaint() 方法不绘制新帧
【发布时间】:2017-04-28 17:51:12
【问题描述】:

我查看了很多答案,但仍然找不到解决方案。我有一个 JFrame 和两个 JPanel。我想在按下按钮时删除一个面板并用第二个面板替换它,但是 repaint() 方法不会刷新框架。请帮忙。

这是我的框架代码:

import javax.swing.*;
import java.awt.*;
import static javax.swing.JFrame.EXIT_ON_CLOSE;

public class MainFrame
{
    static JFrame mainFrame;

    int height = 650;
    int width = 1042;

    public MainFrame()
    {
        mainFrame = new JFrame();
        mainFrame.setBounds(0, 0, width, height);
        mainFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        mainFrame.setResizable(false);
    }

    public static void main(String[] args)
    {
        new MainMenu();
        mainFrame.setVisible(true);
    }
}

这是我的 MainMenu 面板的代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import static java.awt.Color.CYAN;
import static java.awt.Color.red;

public class MainMenu extends MainFrame
{
    public MainMenu()
    {
        components();
    }

    //variable decleration
    JPanel menuPanel;
    JLabel title;
    JButton periodicTable;

    private void components()
    {
        int buttonW = 500;
        int buttonH = 50;

        //creating panel
        menuPanel = new JPanel();
        menuPanel.setLayout(null);
        menuPanel.setBackground(CYAN);

        //creating title label
        title = new JLabel("Application Title", SwingConstants.CENTER);
        title.setFont(new Font("Calibri Body", 0, 50));
        title.setBounds(width / 3 - buttonW / 2, 50, buttonW, buttonH + 10);

        //creating periodic table button
        periodicTable = new JButton();
        periodicTable.setText("Periodic Table");
        periodicTable.setBounds(width / 3 - buttonW / 2, 50 + buttonH + 60, buttonW, buttonH);
        periodicTable.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
        {
            periodicTableActionPerformed(event);
        }
        });

        //adding components to panel
        menuPanel.add(title);
        menuPanel.add(periodicTable);

        //adding panel to MainFrame
        mainFrame.add(menuPanel);
    }

    private void periodicTableActionPerformed(ActionEvent event)
    {
        mainFrame.remove(menuPanel);
        mainFrame.repaint();
        new PeriodicTable();
        mainFrame.repaint();
    }
}

最后是我的周期表面板

import javax.swing.*;
import java.awt.*;

public class PeriodicTable extends MainFrame
{
    public PeriodicTable()
    {
        periodicComponents();
    }

    JPanel ptPanel;

    private void periodicComponents()
    {
        ptPanel = new JPanel();
        ptPanel.setLayout(null);
        ptPanel.setBackground(Color.RED);
        mainFrame.add(ptPanel);
    }
}

【问题讨论】:

    标签: java swing jframe jpanel repaint


    【解决方案1】:

    我不知道你为什么要扩展 MainFrame。我觉得没必要。

    我想在按下按钮时移除一个面板并用第二个面板替换它

    然后使用CardLayout。请阅读 How to Use CardLayout 上的 Swing 教程中的部分以获取工作示例。

    本教程将向您展示如何更好地构建代码。

    【讨论】:

      【解决方案2】:

      您的PeriodicTable 扩展了MainFrame。创建new PeriodicTable 时,您会使用它创建新的MainFrame,它有自己的JFrame 实例(MainFrame.mainFrame)。您需要将该面板添加到 MainMenu 中的现有 mainFrame

      我建议删除更改您的 PeriodicTable 类,如下所示:

      import javax.swing.*;
      import java.awt.*;
      
      public class PeriodicTable extends JPanel // Not MainFrame, but new custom panel
      {
          public PeriodicTable()
          {
              periodicComponents();
          }
      
      
          private void periodicComponents()
          {
              // You don't need ptPanel anymore, because `this` is JPanel
              setLayout(null);
              setBackground(Color.RED);
          }
      }
      

      并将您的 actionPerformed 函数更改为如下内容:

          private void periodicTableActionPerformed(ActionEvent event)
          {
              mainFrame.remove(menuPanel); // Remove old panel
      
              mainFrame.add(new PeriodicTable()); // Create and add to existing mainFrame
              mainFrame.repaint(); // Just one repaint at the end
              // I think it will work even without repaint, because add and remove should schedule repainting as well
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-28
        • 2011-12-28
        • 1970-01-01
        • 2012-11-07
        • 1970-01-01
        • 2015-05-03
        • 2019-06-15
        • 2013-03-12
        相关资源
        最近更新 更多