【问题标题】:Java Swing repack componentsJava Swing 重新打包组件
【发布时间】:2013-10-08 23:16:35
【问题描述】:

我在使用卡片布局时遇到了打包功能的问题。 我创建了 1 个 JFrame,其中包括 JPanel(在卡片布局中),这个 JPanel 包含两个 JPanel。 ...所以当我运行我的程序时,窗口的大小会调整为程序中最大的 JPanel,我无法动态调整它的大小。

现在屏幕: 当我仅使用此面板运行程序时,我的背景 1(较小的背景)类的宽度为 200 http://i41.tinypic.com/scfi88.jpg 当我运行添加了 background2 的程序时,背景会得到它的宽度,所以它看起来像 400 http://i41.tinypic.com/2lu742x.jpg 所以它得到了我的 background2 面板的宽度

在两个背景类中,我都有返回预览背景的按钮,但它从不调整大小。我已经在这些操作按钮上使用了重新验证和重新绘制功能。 代码: 主班和 背景1和 background2(背景代码很大,因为它们是由netbeans设计模式生成的(它们只是几个空组件):

public class main extends javax.swing.JFrame {

private JPanel mainPanel;

public main() {
    mainPanel = new JPanel(new CardLayout());
    add(mainPanel);

    Background2 card1 = new Background2(mainPanel);
    Background1 card2 = new Background1(mainPanel);
    mainPanel.add(card1,"card1");
    mainPanel.add(card2,"card2");
    CardLayout cl = (CardLayout) (mainPanel.getLayout());
    cl.show(mainPanel, "card1");
    mainPanel.revalidate();
    mainPanel.repaint();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
}
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new main().setVisible(true);
        }
    });
}
}



public class Background1 extends javax.swing.JPanel {


private JPanel mainPanel;
/**
 * Creates new form HomePanel
 */
public Background1(JPanel panel) {
    mainPanel=panel;
    initComponents();
}


public JPanel getMainPanel() {
    return mainPanel;
}

public void setMainPanel(JPanel mainPanel) {
    this.mainPanel = mainPanel;
}
/**
 * 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">                          
private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    jTable1 = new javax.swing.JTable();
    left_Panel = new javax.swing.JPanel();
    zakladka1_Button = new javax.swing.JButton();
    background_Panel = new javax.swing.JPanel();
    jScrollPane2 = new javax.swing.JScrollPane();
    jTable2 = new javax.swing.JTable();
    powrot_Button = new javax.swing.JButton();
    jLabel1 = new javax.swing.JLabel();
    jScrollPane3 = new javax.swing.JScrollPane();
    jTable3 = new javax.swing.JTable();

    jTable1.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {
            {null, null, null, null},
            {null, null, null, null},
            {null, null, null, null},
            {null, null, null, null}
        },
        new String [] {
            "Title 1", "Title 2", "Title 3", "Title 4"
        }
    ));
    jScrollPane1.setViewportView(jTable1);

    zakladka1_Button.setText("button");
    zakladka1_Button.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            zakladka1_ButtonActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout left_PanelLayout = new javax.swing.GroupLayout(left_Panel);
    left_Panel.setLayout(left_PanelLayout);
    left_PanelLayout.setHorizontalGroup(
        left_PanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(left_PanelLayout.createSequentialGroup()
            .addContainerGap()
            .addComponent(zakladka1_Button)
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );
    left_PanelLayout.setVerticalGroup(
        left_PanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(left_PanelLayout.createSequentialGroup()
            .addGap(5, 5, 5)
            .addComponent(zakladka1_Button)
            .addGap(433, 433, 433))
    );

    jTable2.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {
            {null, null, null, null},
            {null, null, null, null},
            {null, null, null, null},
            {null, null, null, null}
        },
        new String [] {
            "Title 1", "Title 2", "Title 3", "Title 4"
        }
    ));
    jScrollPane2.setViewportView(jTable2);

    javax.swing.GroupLayout background_PanelLayout = new javax.swing.GroupLayout(background_Panel);
    background_Panel.setLayout(background_PanelLayout);
    background_PanelLayout.setHorizontalGroup(
        background_PanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(background_PanelLayout.createSequentialGroup()
            .addGap(32, 32, 32)
            .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 452, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(83, Short.MAX_VALUE))
    );
    background_PanelLayout.setVerticalGroup(
        background_PanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, background_PanelLayout.createSequentialGroup()
            .addContainerGap(14, Short.MAX_VALUE)
            .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 319, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap())
    );

    powrot_Button.setText("<--");
    powrot_Button.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            powrot_ButtonActionPerformed(evt);
        }
    });

    jLabel1.setText("jLabel1");

    jTable3.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {
            {null, null, null, null},
            {null, null, null, null},
            {null, null, null, null},
            {null, null, null, null}
        },
        new String [] {
            "Title 1", "Title 2", "Title 3", "Title 4"
        }
    ));
    jScrollPane3.setViewportView(jTable3);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
    this.setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(left_Panel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGroup(layout.createSequentialGroup()
                    .addGap(21, 21, 21)
                    .addComponent(powrot_Button)))
            .addGap(18, 18, 18)
            .addComponent(background_Panel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jLabel1)
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(18, 18, 18)
            .addComponent(powrot_Button, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
            .addComponent(left_Panel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        .addGroup(layout.createSequentialGroup()
            .addComponent(background_Panel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(0, 0, Short.MAX_VALUE))
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                    .addComponent(jLabel1)
                    .addGap(115, 115, 115))
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                    .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGap(42, 42, 42))))
    );
}// </editor-fold>                        

private void powrot_ButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
    CardLayout cl = (CardLayout) (mainPanel.getLayout());
    cl.show(mainPanel, "card1");
    mainPanel.revalidate();
    mainPanel.repaint();
}                                             

private void zakladka1_ButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                 

}                                                



// Variables declaration - do not modify                     
private javax.swing.JPanel background_Panel;
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JTable jTable1;
private javax.swing.JTable jTable2;
private javax.swing.JTable jTable3;
private javax.swing.JPanel left_Panel;
private javax.swing.JButton powrot_Button;
private javax.swing.JButton zakladka1_Button;
// End of variables declaration                   
}

public class Background2 extends javax.swing.JPanel {


private JPanel mainPanel;

public Background2(JPanel panel) {
    mainPanel=panel;
    initComponents();  
}

/**
 * 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">                          
private void initComponents() {

    loginFieldLabel = new javax.swing.JLabel();
    zalogujButton = new javax.swing.JButton();
    loginField = new javax.swing.JTextField();
    passwordField = new javax.swing.JPasswordField();
    logowanieLabel = new javax.swing.JLabel();
    passwordFieldLabel = new javax.swing.JLabel();
    jButton1 = new javax.swing.JButton();

    loginFieldLabel.setText("Login");

    zalogujButton.setText("Zaloguj");
    zalogujButton.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            zalogujButtonActionPerformed(evt);
        }
    });

    loginField.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            loginFieldActionPerformed(evt);
        }
    });

    passwordField.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            passwordFieldActionPerformed(evt);
        }
    });

    logowanieLabel.setText("Logowanie");

    passwordFieldLabel.setText("Hasło");

    jButton1.setText("jButton1");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
    this.setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
        .add(layout.createSequentialGroup()
            .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .add(zalogujButton)
            .add(149, 149, 149))
        .add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup()
            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                .add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup()
                    .addContainerGap()
                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(logowanieLabel)
                        .add(layout.createSequentialGroup()
                            .add(56, 56, 56)
                            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                .add(passwordFieldLabel)
                                .add(loginFieldLabel))
                            .add(26, 26, 26)
                            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                                .add(loginField)
                                .add(passwordField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 193, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))))
                .add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup()
                    .add(105, 105, 105)
                    .add(jButton1)))
            .addContainerGap(190, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(layout.createSequentialGroup()
            .addContainerGap()
            .add(logowanieLabel)
            .add(29, 29, 29)
            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                .add(loginField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(loginFieldLabel))
            .add(28, 28, 28)
            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                .add(passwordFieldLabel)
                .add(passwordField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
            .add(33, 33, 33)
            .add(zalogujButton)
            .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
            .add(jButton1)
            .addContainerGap(101, Short.MAX_VALUE))
    );
}// </editor-fold>                        

private void zalogujButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              

}                                             

private void loginFieldActionPerformed(java.awt.event.ActionEvent evt) {                                           
    // TODO add your handling code here:
}                                          

private void passwordFieldActionPerformed(java.awt.event.ActionEvent evt) {                                              
    // TODO add your handling code here:
}                                             

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    CardLayout cl = (CardLayout) (mainPanel.getLayout());
    cl.show(mainPanel, "card2");
    mainPanel.revalidate();
    mainPanel.repaint();
}                                        



// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
private javax.swing.JTextField loginField;
private javax.swing.JLabel loginFieldLabel;
private javax.swing.JLabel logowanieLabel;
private javax.swing.JPasswordField passwordField;
private javax.swing.JLabel passwordFieldLabel;
private javax.swing.JButton zalogujButton;
// End of variables declaration                   
}

编辑:

CardLayout cl = (CardLayout) (mainPanel.getLayout());
cl.show(mainPanel, "card1");
l.preferredLayoutSize(mainPanel);//l = ShowingSizeCardLayout i added here prints on dim.width and dim.height 
mainPanel.revalidate();

输出:

width: 509
height: 323
width: 1203
height: 537

但它始终是 509 323。

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖 SSCCE。 (一个源文件,不是 3 个。)顺便说一句 - 对于屏幕截图,PNG 比 JPG 更好。请参阅How do I create screenshots?(有关制作出色屏幕截图的提示)。
  • 好的,我修复了一点代码。关于图片,我没有足够的声誉来使用该功能。谢谢建议。
  • “关于我没有足够的声誉来使用该功能的图片” 我提供的链接几乎与将图片发布到网站和一切 用于制作 可以上传到此站点、任何其他图像站点或用于记录程序本身的出色图像。请再读一遍,这次更仔细。至于将图像上传到 this 站点 (SO),如果它们不是 JPEG,它们的字节数会更小,我会为你完成的。
  • 顺便说一句 - 取出来源之间的空间并使整个帖子成为“一个文本区域”并不是我的意思。如果您复制/粘贴该烂摊子,它将无法编译(如果您不相信我,请尝试一下)。运行时问题的 SSCCE 应该为每个人编译。请仔细阅读文档..

标签: java swing jpanel layout-manager cardlayout


【解决方案1】:

CardLayout 的默认行为是设置 容器的首选尺寸为 显示尺寸和插图的组件。

你应该继承 CardLayout 并覆盖 preferredLayoutSize方法:

class ShowingSizeCardLayout extends CardLayout {

    public Dimension preferredLayoutSize(Container container) {

        Insets insets = container.getInsets();

        Dimension dim = null;

        for (Component component : container.getComponents()) {
            if (component.isVisible()) {
                dim = component.getPreferredSize();
            }
        }

        dim.width += insets.left + insets.right;
        dim.height += insets.top + insets.bottom;

        return dim;

    }
}

这样就可以了,但是添加代码来检查空指针。

【讨论】:

  • 嗯差不多了。当我运行程序时,面板被调整为更小的 JPanel。当我更改为第二个更大的面板时,宽度尺寸会变小。所以之前的 200 是 400,现在是 400 200。我在换卡时开始调用这个 prefferedsizefuncion,它似乎计算出很好的宽度和高度,但 jpanel 没有调整大小(代码在“编辑”之后的第一篇文章中)跨度>
  • 你不应该打电话给preferredLayoutSize。应该由布局管理器执行此操作。框架,因此,具有卡片布局的面板将具有第一个“面板卡片”的大小。如果您更改显示卡,则框架和主面板不应自动调整大小,即使首选大小已更改。在preferredLayoutSize 中,您设置的是首选大小,而不是当前大小。如果要将框架调整为首选大小,请调用pack 方法。同样,不要打电话给preferredLayoutSize
  • 大成功!!非常感谢。使用带有 fram.pack() 覆盖的 CardLayout 解决了我的问题! @Andrew Thompson 问题已解决,所以我不会编辑第一篇文章,抱歉;p
  • 再一个q。例如,如果我动态创建表并添加 10 行会怎样?我应该以同样的方式调用 preferreflayoutsize 方法然后打包?
  • 你不应该打电话给preferredLayoutSize。当您调用 pack 时,布局管理器会执行此操作。
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
相关资源
最近更新 更多