java - 搜索用另一个面板替换面板的命令

标签 java swing jframe panel

我正在制作一个带有 swing 的图形程序,其中涉及将带有组件的各种面板放置在框架上。其中之一是带有按钮的面板,当选择选项菜单中的选项时,该面板将完全替换为具有不同按钮的另一个面板。我们一直在思考,似乎最好的方法是,每次选择该选项时,从头开始重建框架。

这是我构建主面板的代码片段:

import java.awt.Color;
import java.awt.Dimension;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

import com.jtattoo.plaf.graphite.GraphiteLookAndFeel;
import com.nacher.calc.Main;
import com.nacher.calc.controller.Controller;

import net.miginfocom.swing.MigLayout;


/**
 * 
 * @author chema && Sergio
 * This Panel contains buttons and textbox to perform the calculator actions
 */
public class PanelCalculator extends JPanel implements PropertyChangeListener {
    private static final long serialVersionUID = -8377215712645516042L;

    private PanelNumbers panelNumbers;
    private PanelScreen panelScreen;
    private PanelOptions panelOptions;
    private PanelScientific panelScientific;

    public Controller controller;

    public PanelCalculator(Controller controller) {
        this.controller = controller;

        //Initialize JTattoo Library        
        try{
            UIManager.setLookAndFeel(new GraphiteLookAndFeel());
        }catch(UnsupportedLookAndFeelException ulafe){
            System.out.println("JTattoo Graphite failed to set");
        }
        this.setLayout(new MigLayout("wrap"));
        buildComponents();
        situateComponents();

        //controller = new Controller();
        controller.addPropertyChangeListener(panelScreen);//panelScreen escucha al controller
        panelOptions.addPropertyChangeListener(controller);//controller escucha al panelOptions
        panelNumbers.addPropertyChangeListener(controller);//controller escucha al panelNumbers
        panelScreen.addPropertyChangeListener(controller);//controller escucha al panelScreen       
    }

    private void buildComponents(){
        this.setPreferredSize(new Dimension(210, 280));
        this.setBorder(new EmptyBorder(0, 0, 0, 0));
        panelOptions = new PanelOptions();
        panelOptions.setBorder(new EmptyBorder(0, 0, 0, 0));
        panelOptions.setPreferredSize(new Dimension(200, 50));

        panelScreen = new PanelScreen();
        panelScreen.setBorder(BorderFactory.createEtchedBorder());          
        panelScreen.setPreferredSize(new Dimension(200, 40));
        panelScreen.setBackground(new Color(255, 255, 255));

        panelNumbers = new PanelNumbers();
        panelNumbers.setBorder(new EmptyBorder(0, 0, 0, 0));        
        panelNumbers.setPreferredSize(new Dimension(200, 185));

        panelOptions.addPropertyChangeListener(panelScreen);//panelScreen escucha al panelOptions   
        panelNumbers.addPropertyChangeListener(panelScreen);//panelScreen escucha al panelNumbers   
    }

    private void situateComponents(){
        this.add(panelOptions, "span");
        this.add(panelScreen, "span");  
        this.add(panelNumbers, "span" );        
    }


    /**
     * To build the Scientific Calculator
     */
    private void buildScientific() {
        //Instantiate the panelScientific
        panelScientific = new PanelScientific();
        panelScientific.setBorder(new EmptyBorder(0, 0, 0, 0));     
        panelScientific.setPreferredSize(new Dimension(200, 185));      
        //Reordering the Panel Calculator
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        String c = evt.getPropertyName();
        if (c.equals(Constants.SET_CALC_SCIENTIFIC)) {
            System.out.println("Set the Scientific Calculator");
            buildScientific();
        }       
    }

}

这是我们构建框架的主类:

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import com.jtattoo.plaf.bernstein.BernsteinLookAndFeel;
import com.jtattoo.plaf.fast.FastLookAndFeel;
import com.jtattoo.plaf.graphite.GraphiteLookAndFeel;
import com.jtattoo.plaf.hifi.HiFiLookAndFeel;
import com.jtattoo.plaf.luna.LunaLookAndFeel;
import com.nacher.calc.controller.Controller;
import com.nacher.calc.ui.Constants;
import com.nacher.calc.ui.ImageConstants;
import com.nacher.calc.ui.PanelCalculator;


public class Main extends JFrame implements PropertyChangeListener {

    private static final long serialVersionUID = -4136829057174783241L;

    private static Main mySelf;
    private static PanelCalculator panelCalc;

    public static Controller controller;

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });     
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {

        controller = new Controller();
        panelCalc = new PanelCalculator(controller);
        controller.addPropertyChangeListener(panelCalc);
        mySelf = new Main();
        try {
            mySelf.setTitle("Calculator");
            mySelf.setLocationRelativeTo(null);
            mySelf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            mySelf.setIconImage(new ImageIcon(mySelf.getClass().getResource(ImageConstants.CALC_IMAGE_THREE)).getImage());
            mySelf.getContentPane().add(panelCalc);
            mySelf.setResizable(false);
            mySelf.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e) {
                    System.out.println("Quitting the application.");
                }
            });
            mySelf.pack();
            mySelf.setVisible(true);
            controller.addPropertyChangeListener(mySelf);
        }catch(Exception ex) {
            System.out.println("The application could not run.");
            System.out.println(ex.getMessage());
            System.exit(-1);
        }
    }

我应该使用什么命令来“取消构建”框架,然后从头开始重建它?有没有更有效的方法将一个面板替换为另一个面板?

最佳答案

卡片布局专为此类功能而设计。它允许您定义多个面板以共享框架的相同空间。然后,您只需指定当前显示哪个面板即可。

阅读 Swing 教程中关于 How to Use CardLayout 的部分了解更多信息和工作示例。

关于java - 搜索用另一个面板替换面板的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44970973/

相关文章:

java - android中无法获取数据并显示在listview中

java - 组合 Java EnumSet

java - 如何在用户浏览 TreeView 时操作一组面板?

java - 如何在 apache 中使用 HttpClient 从 Java Swing 登录页面调用 Servlet?

java - JButton、带背景图像的 JFrame

java - 如何在主框架内制作第二个框架?

java - 如何在编译时确保枚举开关的完整性?

java - Scala 中的多维数组

java - 从 DefaultTableModel 更新 JTable

java - 在处理之前禁用框架