2015-06-20 4 views
-1

Я пытаюсь создать графический интерфейс с JXTaskPane, в котором панель HTML-редактора показывает длинный текст, а затем ниже двух ползунков. Необходимо иметь полную ширину окна, разделенную на 50/50 между меткой и ползунком, следующий слайдер должен иметь 1/3 ширины для метки и 2/3 для ползунка.Нужен репетитор GridBagLayout для манекенов, пожалуйста ... с рабочим примером

Для того, чтобы этот пример работал, вам необходимо SwingX, download the jar here.

Есть несколько проблем, с кодом:

  1. На первом запуске, элементы не нарисованы правильно. Окно должно быть изменено, или панель задач закрыта и снова открыта. Может ли кто-нибудь порекомендовать способ исправить это?
  2. Несмотря на то, что параметр заполнения GridBagConstraint установлен на использование полной ширины горизонтали, компоненты используют примерно половину ширины окна и нарисованы в центре. Как я могу заставить их использовать всю ширину и высоту JXTaskPane?
  3. Хотя slider2 имеет свою gridwidth собственность 2, Почему это так? Я пробовал играть с параметром 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); 

    } 
} 
+0

вы можете опубликовать пример вывода с помощью экрана или изображение – Madhan

+0

Это то, что выглядит в начальной загрузке окна: http://www.inside.net/files/panel1.png, и вот что выглядит после изменения размера: http://www.inside.net /files/panel2.png. Обратите внимание на огромное количество пространства вокруг элементов управления и неправильное расстояние ползунка/метки2. – Balthasar

+0

* «Для запуска этого примера вам понадобится SwingX» *. Лучше всего заменить сторонние API, например, кодом с помощью одного компонента из Swing, и, как правило, это возможно для проблем с раскладкой. –

ответ

0

BorderLayout легче проектировать по сравнению с GridBagLayout. Надеюсь, что это то, что вы просили for.I've использовал 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     
} 

Выход

enter image description here