我有一个带有JFrame的JFrame的GUI,该JPanel可以通过CardLayout管理器进行切换。代码是这样的:
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.Stack;
public class VistaPrincipal extends javax.swing.JFrame {
private Stack<String> nomVistes;
/**
* Creates new form VistaPrincipal
*/
public VistaPrincipal() {
nomVistes = new Stack<>();
initComponents();
this.setTitle("Dynamic Academic Scheduler");
this.setResizable(false);
}
public void tornarInici() {
System.out.println("[ INFO ] Solicitat tornar al menu inicial");
((CardLayout) ventana.getLayout()).first(ventana);
pack();
}
public void tornarEnrere() {
System.out.println("[ INFO ] Solicitat tornar a la vista anterior amb nom: " + nomVistes.peek());
((CardLayout) ventana.getLayout()).show(ventana, nomVistes.peek());
pack();
nomVistes.pop();
}
这些方法是真正在JPanel之间切换的方法。
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
ventana = new javax.swing.JPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(new java.awt.CardLayout());
ventana.setLayout(new java.awt.CardLayout());
getContentPane().add(ventana, "card2");
pack();
}// </editor-fold>//GEN-END:initComponents
initComponents()由Netbeans自动生成。
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel ventana;
// End of variables declaration//GEN-END:variables
这是JPanel,我们可以看到正在切换的其余JPanel。 }
这些方法使我可以浏览制作的几个JPanel,情况是我使用 pack()避免弄乱硬接线尺寸(setSize,minimumSize,max ...),一开始效果很好,将JPanels打包好,直到我切换到比其他JPanel更大的JPanel为止,而当我向后退(通过卡)时,JFrame会坚持使用它占用的更大尺寸。
因此, pack()正在努力使面板更大并且适合它,但是一旦面板已经变得更大就不再适合较小的面板。也许我误解了 pack()的作用是什么?
非常感谢您。