搜索命令以将面板替换为另一个面板



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

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

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);
}
}

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

Card Layout是为这种类型的功能而设计的。它允许您定义多个面板以共享框架的相同空间。然后,您只需指定当前显示的面板。

阅读 Swing 教程中有关如何使用 CardLayout 的部分,了解更多信息和工作示例。

我不知道我是否完全理解你的问题,但如果,这将是我的解决方案(只是一个简单的例子(:

public class Main extends JFrame{
public Main(){
setTitle("Calculator");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
Panels panels = new Panels();
add(panels, BorderLayout.CENTER);
setLocationRelativeTo(null);
pack();
setVisible(true);
}
}

.

public class Panels extends JPanel{
public JPanel p1, p2;
public Panels(){
p1 = new JPanel();
add(p1);
p2 = new JPanel();
add(p2); 
//p1 and p2 might be more complex Components
//place them using your preferred LayoutManager 
//(set their preferredSize etc.)
}
public void updateP1(JPanel np1){
remove(p1);
p1 = np1;
add(p1);
}
public void updateP2(JPanel np2){
remove(p2);
p2 = np2;
add(p2);
}
}

我认为您正在寻找的是JComponent的方法删除(组件组合(,即JPanel。希望有帮助。

最新更新