2016-06-11 146 views
0

我必须更改我的程序在Swing中实现的GUI。现在我在单独的窗口中有很多图表,我想更改它们,使它们全部显示在一个窗口中。原始版本的构造是JFrame有一个JPanel字段。 JFrame没有设置布局。将JFrame(无布局)更改为JPanel

private void initComponents() {// GEN-BEGIN:initComponents 

     getContentPane().setLayout(null); 

     setTitle("Wykres"); 
     addComponentListener(new java.awt.event.ComponentAdapter() { 
      public void componentResized(java.awt.event.ComponentEvent evt) { 
       resizedWindow(evt); 
      } 
     }); 
     addWindowListener(new java.awt.event.WindowAdapter() { 
      public void windowClosing(java.awt.event.WindowEvent evt) { 
       exitForm(evt); 
      } 
     }); 

     java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); 
     setBounds((screenSize.width - MIN_WIDTH)/2, (screenSize.height - MIN_HEIGHT)/2, MIN_WIDTH, MIN_HEIGHT); 
    } 

的JPanel被声明如下:

BorderLayout borderLayout = new BorderLayout(); 
      borderLayout.setHgap(0); 
      borderLayout.setVgap(0); 
      drawPanel = new JDrawPanel(); 
      drawPanel.setLayout(borderLayout); 
      drawPanel.setComponentOrientation(ComponentOrientation.UNKNOWN); 
setContentPane(drawPanel); 

如果我由JFrame删除继承和添加的JPanel继承,该方法的paintComponent不叫。我认为原因是布局设置不好。然而,程序计算边缘的距离,我不想改变它。我怎样才能轻松编辑这个程序?

我也是在NetBeans

产生新的GUI
public class ViewPanel extends javax.swing.JFrame { 

    public ViewPanel() { 
     // initComponents(); 
    } 
    public ViewPanel(JPanel histo, JPanel dystrybu, JPanel time){ 
     initComponents(histo, dystrybu, time); 
    } 
    /** 
    * 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(JPanel histo, JPanel dystrybu, JPanel time) { 

     MainTabs = new javax.swing.JTabbedPane(); 
     jHistoTab = histo; 
     jDystybuTab = dystrybu; 
     jTimeTab = time; 



     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     setTitle("zaleznosc czasowa"); 

     MainTabs.setToolTipText(""); 
     MainTabs.addTab("histogram", jHistoTab); 
     MainTabs.addTab("dystrybuanta", jDystybuTab); 
     MainTabs.addTab("zalenosc czasowa", jTimeTab); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(MainTabs, javax.swing.GroupLayout.DEFAULT_SIZE, 712, Short.MAX_VALUE) 
       .addContainerGap()) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(MainTabs, javax.swing.GroupLayout.DEFAULT_SIZE, 363, Short.MAX_VALUE) 
       .addContainerGap()) 
     ); 

     MainTabs.getAccessibleContext().setAccessibleName(""); 


     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(ViewPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(ViewPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(ViewPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(ViewPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new ViewPanel().setVisible(true); 
       AppSMO.main(null); 
      } 
     }); 
    } 
    public void setHistoTab(JPanel panel){ 
     jHistoTab=panel; 
    } 

    // Variables declaration - do not modify      
    private javax.swing.JTabbedPane MainTabs; 
    private JPanel jDystybuTab; 
    private JPanel jHistoTab; 
    private JPanel jTimeTab; 
    // End of variables declaration     
} 
+0

Java GUI必须使用不同语言环境中使用不同PLAF的不同OS,屏幕大小,屏幕分辨率等。因此,它们不利于像素的完美布局。请使用布局管理器或[它们的组合](http://stackoverflow.com/a/5630271/418556)以及[white space]的布局填充和边框(http://stackoverflow.com/a/17874718/ 418556)。 –

回答

0

设置一个BorderLayout的到contentPane。将你的面板添加到contentPane。 这会给它中心约束,所以它会适应窗口的大小。 在面板中,您可以随意添加所需的任何组件。我建议你不要在任何地方使用空布局。 避免绝对定位。

+0

*“我建议您不要在任何地方使用空布局。”*第三句对于该建议来说太晚了。它应该是第一句话在它自己的段落。 –