【问题标题】:Need a GridBagLayout tutor for dummies please... with working example需要一个 GridBagLayout 的傻瓜导师... 带有工作示例
【发布时间】:2015-06-20 06:41:55
【问题描述】:

我正在尝试创建一个具有JXTaskPane 的 GUI,其中一个 HTML 编辑器窗格显示一些冗长的文本,然后在其下方是两个滑块。一个应该有整个窗口宽度在标签和滑块之间划分为 50/50,下一个滑块应该有标签宽度的 1/3 和滑块的 2/3。

要运行此示例,您需要 SwingX,download the jar here

代码有几个问题:

  1. 第一次启动时,元素未正确绘制。需要调整窗口大小,或者关闭并重新打开任务窗格。谁能推荐一种方法来解决这个问题?
  2. 即使GridBagConstraint 填充参数设置为使用全水平宽度,组件也只使用了大约一半的窗口宽度并在中心绘制。如何让他们使用JXTaskPane 的全宽和全高?
  3. 尽管slider2 将其gridwidth 属性设置为2(标签将其设置为1),但实际上它比其标签更窄!为什么这样做?我尝试使用weightx 参数,但这只是将外观随机更改为更宽或更窄,但似乎是一种随机且相当不可预测的方式。如何使此标签为其滑块宽度的 1/3?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import org.jdesktop.swingx.JXTaskPane;

class test {
  public static void main(String[] arg) {
    JFrame mainWindow = new JFrame();
    JXTaskPane taskPane = new JXTaskPane();
    JSlider slider1 = new JSlider(0,100,50);
    JSlider slider2 = new JSlider(0,100,50);

    taskPane.setCollapsed(false);

    // slider 1 with its label in a simple GridLayout
    JPanel pnlSlider1 = new JPanel();
    pnlSlider1.setLayout(new GridLayout(1,1));  // 1 row, 1 column
    pnlSlider1.add(new JLabel("Description for slider1"));
    pnlSlider1.add(slider1);

    // slider 2 with its label is in a GridBagLayout, the label should be 1/3 of the width of the slider
    JPanel pnlSlider2 = new JPanel();
    pnlSlider2.setLayout(new GridBagLayout());
    GridBagConstraints c2 = new GridBagConstraints();
    c2.fill = GridBagConstraints.HORIZONTAL;
    c2.gridx = 0;
    c2.gridy = 0;
    c2.gridwidth = 1;
    c2.weighty = 1;
    c2.weightx = 1;
    pnlSlider2.add(new JLabel("Description for slider2"), c2);
    c2.gridx = 1;
    c2.gridwidth = 2;
    c2.weightx = 1;
    pnlSlider2.add(slider2, c2);

    // label should now be to the left of slider

    String content = "<html>Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content ";
    content += "Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content";
    content += "Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content </html>";
    JEditorPane ep = new JEditorPane("text/html", content);

    // this is the main window panel
    //JPanel panel = new JPanel();
    taskPane.setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.gridy = 0;
    taskPane.add(ep, c);
    c.gridy = 1;
    taskPane.add(pnlSlider1, c);
    c.gridy = 2;
    c.insets = new Insets(10,0,0,0);
    taskPane.add(pnlSlider2, c);

    // tie it all together and display the window
        mainWindow.setPreferredSize(new Dimension(600, 600));
        mainWindow.setLocation(100, 100);
        mainWindow.getContentPane().add(taskPane);
        mainWindow.pack();
        mainWindow.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        mainWindow.setVisible(true);

  }
}

【问题讨论】:

  • 你可以通过截图或图片发布示例输出
  • 这是初始加载窗口的样子:inside.net/files/panel1.png,这是调整大小后的样子:inside.net/files/panel2.png。请注意控件周围的巨大空间,以及滑块/label2 的不正确间距。
  • "为了让这个例子运行,你需要 SwingX" 如果可能的话,最好用 Swing 中的单个组件替换 3rd 方 API,例如代码,它是通常可能是布局问题..

标签: java swing layout-manager gridbaglayout swingx


【解决方案1】:

BorderLayoutGridBagLayout 相比更易于设计。希望这是您所要求的。我使用 Netbeans 创建布局,然后将其添加到 JXTaskPane

import org.jdesktop.swingx.JXTaskPane;
import org.jdesktop.swingx.JXTaskPaneContainer;


public class NewJFrame extends javax.swing.JFrame {

/**
 * Creates new form NewJFrame
 */
public NewJFrame() {
    initComponents();
    initTaskPane();
    setLocationRelativeTo(null);
}

private void initTaskPane() {
    JXTaskPaneContainer taskpanecontainer = new JXTaskPaneContainer();
    JXTaskPane taskPane = new JXTaskPane();
    taskPane.setLayout(new java.awt.BorderLayout());
    taskPane.add(contentPanel, java.awt.BorderLayout.CENTER);
    taskPane.setCollapsed(false);
    taskpanecontainer.add(taskPane);
    this.setContentPane(taskpanecontainer);
}

/**
 * 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() {

    contentPanel = new javax.swing.JPanel();
    jScrollPane1 = new javax.swing.JScrollPane();
    jEditorPane1 = new javax.swing.JEditorPane();
    jPanel1 = new javax.swing.JPanel();
    jLabel1 = new javax.swing.JLabel();
    jSlider1 = new javax.swing.JSlider();
    jLabel2 = new javax.swing.JLabel();
    jSlider2 = new javax.swing.JSlider();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setPreferredSize(new java.awt.Dimension(400, 500));

    contentPanel.setLayout(new java.awt.BorderLayout());

    jScrollPane1.setPreferredSize(new java.awt.Dimension(108, 400));

    jEditorPane1.setContentType("text/html"); // NOI18N
    jEditorPane1.setText("<html>\r\n Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content.Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content.Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content.Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content.Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content.Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content.\n</html>\r\n");
    jScrollPane1.setViewportView(jEditorPane1);

    contentPanel.add(jScrollPane1, java.awt.BorderLayout.CENTER);

    jLabel1.setText("Description for Slider1");

    jLabel2.setText("Description for Slider2");

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel1Layout.createSequentialGroup()
                    .addComponent(jLabel1)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jSlider1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGroup(jPanel1Layout.createSequentialGroup()
                    .addComponent(jLabel2)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jSlider2, javax.swing.GroupLayout.DEFAULT_SIZE, 271, Short.MAX_VALUE)))
            .addContainerGap())
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                .addComponent(jSlider1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                .addComponent(jSlider2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addContainerGap())
    );

    contentPanel.add(jPanel1, java.awt.BorderLayout.SOUTH);

    getContentPane().add(contentPanel, java.awt.BorderLayout.CENTER);

    pack();
}// </editor-fold>                        

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new NewJFrame().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JPanel contentPanel;
private javax.swing.JEditorPane jEditorPane1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JSlider jSlider1;
private javax.swing.JSlider jSlider2;
// End of variables declaration                   
}

输出

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2022-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多