java - 重叠面板 Swing

标签 java swing

我正在尝试执行以下布局,其中在程序启动时除了 panel2 之外的所有 JPanel 都是可见的。当用户单击 btn1 时,JCalendar 和 panel3 被设置为不可见,而 panel2 变为可见。我遇到的问题是在单击 btn1 时没有显示 panel2。但是,如果我将 panel2 的边框布局更改为未使用的边框布局(在本例中为 WES​​T),它将在单击按钮时显示,但它在左侧对齐,我希望它在整个表单中居中。

代码:

public class GUI extends JFrame implements ActionListener, PropertyChangeListener
{
    private JPanel panel1, panel2, panel3;
    private com.toedter.calendar.JCalendar calendar;
    private Button btn1, btn2;
    private JLabel label1, label2;

public GUI()
{
    init();
}

private void init()
{
    //panel1 components
    panel1 = new JPanel();
    btn1 = new JButton("Click me");
    panel1.add(btn1);

    //panel2 components
    panel2 = new JPanel();
    label1 = new JLabel("Time:");
    label2 = new JLabel("Date:");
    panel2.add(label1); panel2.add(label2);

    //JCalendar
    calendar = new com.toedter.calendar.JCalendar();

    //panel3
    panel3 = new JPanel();

    //Add panels to JFrame
    add(panel1, BorderLayout.NORTH);
    add(calendar, BorderLayout.CENTER);
    add(panel2, BorderLayout.CENTER); //if i set this to WEST it show!!
    add(panel3, BorderLayout.EAST);

    //event handling
    btn1.addActionListener(this);

    //hide panel2
    panel2.setVisible(false); 
    pack();
}

public void actionPerformed(ActionEvent ae)
{
    if(ae.getSource().equals(btn1)
    {
        calendar.setVisible(false);
        panel3.setVisible(false);
        panel2.setVisible(true); //make panel2 visible
        panel2.updateUI();
        revalidate();
        repaint();
    }
}

public static void main(String args[])
{
    javax.swing.SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {
            new GUI().setVisible(true);
        }
    });
}

enter image description here

当我点击 btn1 时,JCalendar 和 panel3 不可见,但 panel2 不显示

enter image description here

最佳答案

我可以找到很多问题...

  • BorderLayout 将只允许单个组件占据任何给定位置。也就是说,两个组件不能同时共享CENTER位置,无论一个组件是否不可见。
  • 您永远不应该调用 updateUI,它用于告诉 UI 组件外观已经改变,它们应该更新以响应它。
  • 使用revalidate 告诉容器布局发生了一些变化,它应该执行新的布局过程...

点击前...

enter image description here

点击后...

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class GUI extends JFrame implements ActionListener, PropertyChangeListener {

    private JPanel panel1, panel2, panel3;
//    private com.toedter.calendar.JCalendar calendar;
    private JPanel calendar;
    private JButton btn1, btn2;
    private JLabel label1, label2;

    public GUI() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        init();
    }

    private void init() {
        //panel1 components
        panel1 = new JPanel();
        btn1 = new JButton("Click me");
        panel1.add(btn1);

        //panel2 components
        panel2 = new JPanel();
        label1 = new JLabel("Time:");
        label2 = new JLabel("Date:");

        panel2.add(label1);
        panel2.add(label2);

        //JCalendar
        calendar = new JPanel();//new com.toedter.calendar.JCalendar();
        calendar.setBorder(new LineBorder(Color.RED));
        calendar.add(new JLabel("Calendar"));

        //panel3
        panel3 = new JPanel();
        panel3.setBorder(new LineBorder(Color.BLUE));
        panel3.add(new JLabel("Panel3"));

        panel2.setBorder(new LineBorder(Color.GREEN));

        //Add panels to JFrame
        add(panel1, BorderLayout.NORTH);
        add(calendar, BorderLayout.WEST);
        add(panel2, BorderLayout.CENTER);
        add(panel3, BorderLayout.EAST);

        //event handling
        btn1.addActionListener(this);

        //hide panel2
        panel2.setVisible(false);
        pack();
    }

    public void actionPerformed(ActionEvent ae) {
        if (ae.getSource().equals(btn1)) {
            calendar.setVisible(false);
            panel3.setVisible(false);
            panel2.setVisible(true); //make panel2 visible
//            panel2.updateUI();
            revalidate();
            repaint();
        }
    }

    public static void main(String args[]) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new GUI().setVisible(true);
            }
        });

    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
    }
}

现在,我很确定这不会满足您的所有要求(如我所见)...您至少有两个选择...

  1. 移除Calendar组件,将panel2添加到点击按钮时的CENTER位置
  2. 最好使用 CardLayout

关于java - 重叠面板 Swing ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16473769/

相关文章:

javascript - Ajax 请求正确循环,但未发送到服务器以获取多个文件。数组中只保存一个文件

java - 如何聚合循环中进行 CompletableFuture 调用的结果?

java - PyDev for Eclipse - 解决 Python 依赖关系( Unresolved 导入)

java - 使 BoxLayout 的单元格保持大小并且仅在 java 中调整粘合大小

java - 如何从 JCalendar 获取 JMonthChooser 字符串中的月份名称

java.lang.UnsatisfiedLinkError : org. opencv.core.Core

java - JDBC 连接意外变为空

java - 下拉菜单旁边的 "options"按钮应该使用 "..."还是 ">>"?

java - 为什么我不能在 JFrame 上调用 add() 而必须在容器上调用它?

java - JFrame大网格图