Java摇摆;如何切换面板的可见性?

Posted

技术标签:

【中文标题】Java摇摆;如何切换面板的可见性?【英文标题】:Java swing; How to toggle panel's visibility? 【发布时间】:2011-08-01 18:51:08 【问题描述】:

我制作了这段代码来导航面板 1 和面板 2 按钮。

(button1 和 button2)但是当我运行我的代码时,框架保持为空。

谁能解释一下我做错了什么以及如何完成

以这种方式在 panel1 和 panel2 之间切换?先从 panel1 开始

代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JFrame;

public class togglepanel 

    public static void main(String[] args) 

        final JFrame frame = new JFrame();
        final JPanel panel1 = new JPanel();
        final JPanel panel2 = new JPanel();
        JButton button1 = new JButton("previous frame!");
        JButton button2 = new JButton("next frame");

        frame.setLocationRelativeTo(null);
        frame.setResizable(true);
        frame.setVisible(true);
        frame.setSize(600, 400);
        frame.add(panel1);
        frame.add(panel2);

        panel1.add(button2);
        panel1.setVisible(true);

        panel2.add(button1);
        panel2.setVisible(false);

        button1.addActionListener(new ActionListener() 

            public void actionPerformed(ActionEvent arg0) 

                panel1.setVisible(true);
                panel2.setVisible(false);

            
        );


        button2.addActionListener(new ActionListener() 

            public void actionPerformed(ActionEvent arg0) 

                panel1.setVisible(false);
                panel2.setVisible(true);
            
        );
    

提前致谢

【问题讨论】:

+1 表示sscce。重新格式化的代码;如果不正确,请恢复。 【参考方案1】:

使用布局管理器。

frame.setLayout(new FlowLayout());

【讨论】:

哇它好用!就这么简单?哈哈,这究竟添加了什么让它更像是一种学习体验? 布局管理器负责设置屏幕上所有组件的位置和大小。如果您不使用布局管理器,则必须自己完成所有定位和调整大小。这里是布局管理器的一个很好的解释link 使用不同的布局管理器——JFrame的内容窗格默认使用BorderLayoutadd() 调用默认为CENTER,并且只有一个组件可以在那里,所以第二个覆盖第一个。【参考方案2】:

另一种有用的方法,我认为更好的是使用 CardLayout 并将两个 JPanel 添加到使用此 CardLayout 的容器中。然后,您可以通过调用 CardLayout 方法轻松交换视图。

例如,

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

public class TogglePanel 
   public static void main(String[] args) 
      final CardLayout cardlayout = new CardLayout();
      final JFrame frame = new JFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      final Container contentPane = frame.getContentPane();
      contentPane.setLayout(cardlayout);

      final JPanel panel1 = new JPanel();
      final JPanel panel2 = new JPanel();
      JButton button1 = new JButton("previous frame!");
      JButton button2 = new JButton("next frame");
      contentPane.setPreferredSize(new Dimension(600, 400));
      contentPane.add(panel1, "Panel 1");
      contentPane.add(panel2, "Panel 2");
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setResizable(true);
      frame.setVisible(true);

      panel1.add(button2);
      panel2.add(button1);

      ActionListener btnListener = new ActionListener() 
         public void actionPerformed(ActionEvent e) 
            cardlayout.next(contentPane);
         
      ;

      button1.addActionListener(btnListener);
      button2.addActionListener(btnListener);

   

【讨论】:

哦,是的,我也考虑过 CardLayout,你能从 CardLayout 中提供一些其他方法没有的好处吗? :) CardLayout 将确保所有东西的大小都可以,容器的 preferredSize 将是最大卡片组件的 PreferredSize。 CardLayout 负责重新验证和重新绘制事物,因此更难搞砸。它还允许卡片的顺序更改(通过 next() 和 previous() 方法)和卡片的随机访问更改(通过使用用于将卡片添加到容器中的字符串常量)。

以上是关于Java摇摆;如何切换面板的可见性?的主要内容,如果未能解决你的问题,请参考以下文章

如何切换 Vim 的搜索高亮可见性而不禁用它

Silverlight 4:如何切换控件可见性

如何使用按钮单击来切换 div 的可见性

切换 div 的可见性属性

如何使用 WPF 中的 Alt 键切换主菜单可见性?

如何切换 VueJs 组件的可见性?