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

JPanel不会重新验证

安经纶
2023-03-14

我有一个名为BigPanel的JPanel子类作为JFrame的内容窗格,在BigPanel对象中有一个嵌套的JPanel子类。单击按钮,嵌套面板应该从一个JPanel子类更改为另一个。嵌套面板没有重置,正确的子类将打印到控制台,但实际面板不会更新包com.grantbroadwater;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class BigPanel extends JPanel {

private static final long serialVersionUID = 1L;
public static final int DIM = GUIFrame.DIM;
private JPanel pnl1;

public BigPanel() {
    super(null);
    setSize(new Dimension(DIM, DIM));
    setBackground(Color.WHITE);

    JLabel lbl = new JLabel("Big Panel");
    lbl.setBounds(20, 20, 100, 20);
    add(lbl);

    JButton btn = new JButton("Change");
    btn.setBounds(140, 20, 100, 20);
    btn.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            if(pnl1 instanceof SubPanelOne){
                update(new SubPanelTwo());
            }else if(pnl1 instanceof SubPanelTwo){
                update(new SubPanelOne());
            }
        }

    });
    add(btn);

    pnl1 = new SubPanelOne();
    pnl1.setLocation(20, 100);
    add(pnl1);

}

private void update(JPanel pnl){
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            System.out.print("Pnl1 is of type "+pnl1.getClass());

            pnl1 = pnl;
            revalidate();
            repaint();
            pnl1.revalidate();
            pnl1.repaint();

            System.out.println(" changing to " + pnl1.getClass());
        }

    });
}
}

共有1个答案

岳嘉石
2023-03-14
  1. 避免使用null布局,像素完美布局在现代用户界面设计中是一种错觉。影响组件单个大小的因素太多了,您无法控制其中任何一个。Swing旨在以布局管理器为核心,丢弃这些将导致无休止的问题和问题,您将花费越来越多的时间试图纠正
  2. 使用CardLayout来实现您正在尝试做的事情,这就是它的设计目的。有关更多详细信息,请参阅如何使用CardLayout

核心问题似乎是对变量引用的工作原理缺乏了解。。。

pnl1 = pnl;
revalidate();
repaint();
pnl1.revalidate();
pnl1.repaint();

所有这些将做的就是将pnl1在内存中指向的内容更改为pnl在内存中指向的内容。它不会影响屏幕上的任何内容。您必须实际删除pnl1并添加pnl才能发生任何更改。

随着布局管理器的丢弃,这会增加复杂性,因为每次尝试切换组件时,都需要更新每个组件的大小和位置。

无效重新验证验证都与布局管理API相关。如果你选择忽略它,它们真的没有什么意义。

 类似资料:
  • 在我的摆动应用程序中,我在一个框架中有两个面板。第一个面板有一个按钮。当我单击此按钮时,一些数据会发生变化,我希望第二个面板的内容也会发生变化,显示新数据(通过jtag)。repaint()不起作用。我尝试了各种更新(参见代码中的注释)。 我提到了第二个小组。我可以使用该引用更改第二个面板的颜色,但无法重新绘制。我也可以在第二个面板中引用jlabel,只需更改其文本,但这个问题的重点是使panel

  • 问题内容: 我是Java的初学者,我正在尝试创建一个在光标所在的位置绘制一个矩形的应用程序。我已经完成了所有操作,但无法获得重绘的信息。如果没有重绘,则矩形仅绘制一次,仅此而已。使用重新绘制,它可以很好地编译,但是当我运行它时,每次移动鼠标时,都会出现这个大错误。 所以,有人可以帮我吗? 问题答案: 希望代码示例中的注释能够告诉您您在代码中做错了什么:-),否则总有理由提出您的疑问…

  • 编辑:当我拖动边框时,某种刷新被发送,我需要弄清楚并手动发送相同的刷新。 请注意,我已经尝试使用revalidate()和repaint()。 当使用JFrame和JPanel来显示一个框架时,我试图使框架的大小易于改变。 null 此外,一个重要的注意事项是,当您拖动边框时,白条会消失,并正确地重新加载/刷新内容(即使您只是少量拖动)

  • 我在artPanel JPanel类中实现了MouseListener和MouseMotionListener。看来这解决了我的一些问题。但有几个问题: 您可以在这里下载我的java文件,以便更容易地识别问题。 我想不通的问题: “行”按钮无法正确创建行。我一直在玩mouseListener方法,但我无法使其工作。我希望它在单击和拖动鼠标的同时只画一条线。 其他按钮可以正确绘制形状。然而...当我

  • 问题内容: 我的页面上有一个表单,当我调用它时,将forms类设置为,但仍然返回true。我在这里做错了什么? 模板 零件 问题答案: 它()行为正确。您的表单需要用户名和密码,因此,当您重置表单时,该表单应该无效(即,没有用户名/密码的表单无效)。 如果我理解正确,那么这里的问题就是为什么在您第一次加载页面(表单也是无效的)时并没有出现红色错误,而是在您单击按钮时弹出了红色错误。当您使用Mate

  • 我想重新绘制我的屏幕。到目前为止,它所做的只是在第一个屏幕上的头部应该在的地方显示一个点。这很好,但是我在代码中写了我想每秒将头部向下移动10个像素。我正在打印头部应该在的位置,在命令提示符中它显示y值确实在增加。但是在我的屏幕上,头部没有移动。 我尝试过使用revalidate方法,尝试扩展canvas类而不是jframe,我尝试过只为paint方法使用不同的类,我尝试过用paintCompon