2017-08-27 131 views
3

我正在使用GridBagLayout來排列框架中的某些組件。
當框架第一次創建時,組件在它們之間有一個體面的空間。 enter image description here在調整JFrame的大小時刪除組件之間的額外空間

但只要我調整框架有很多的無用空間的組件之間 enter image description here

我試圖調整權重和插圖被一些用戶的建議,但它似乎並沒有解決問題

import java.awt.GridBagLayout; 
import java.awt.GridBagConstraints; 
import java.awt.Insets; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.JMenuBar; 
import javax.swing.JMenu; 
import javax.swing.JTextArea; 

public class Frame1 extends JFrame { 

    JLabel one = new JLabel("one"); 
    JLabel two = new JLabel("two"); 
    JLabel three = new JLabel("three"); 

    JTextField oneF = new JTextField(20); 
    JTextField twoF = new JTextField(20); 
    JTextField threeF = new JTextField(20); 

    JMenuBar menuBar = new JMenuBar(); 
    JMenu menu = new JMenu("menu"); 

    GridBagConstraints c = new GridBagConstraints(); 

    public Frame1() { 
     setTitle("GridBagLayout Test"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLayout(new GridBagLayout()); 

     menuBar.add(menu); 

     c.gridx = 0; 
     c.gridy = 0; 
     c.gridwidth = c.REMAINDER; 
     c.fill = c.HORIZONTAL; 
     c.gridheight = 1; 
     c.weightx = 1; 
     c.weighty = 1; 
     c.anchor = c.NORTH; 
     c.insets = new Insets(5,5,5,5); 
     add(menuBar, c); 

     c.gridx = 0; 
     c.gridy = 1; 
     c.gridwidth = 1; 
     c.fill = c.NONE; 
     c.gridheight = 1; 
     c.weightx = 1; 
     c.weighty = 1; 
     c.anchor = c.NORTH; 
     c.insets = new Insets(5,5,5,5); 
     add(one, c); 

     c.gridx = 1; 
     c.gridy = 1; 
     c.gridwidth = 1; 
     c.fill = c.NONE; 
     c.gridheight = 1; 
     c.weightx = 1; 
     c.weighty = 1; 
     c.anchor = c.NORTH; 
     c.insets = new Insets(5,5,5,5); 
     add(oneF, c); 

     c.gridx = 0; 
     c.gridy = 2; 
     c.gridwidth = 1; 
     c.fill = c.NONE; 
     c.gridheight = 1; 
     c.weightx = 1; 
     c.weighty = 1; 
     c.anchor = c.NORTH; 
     c.insets = new Insets(5,5,5,5); 
     add(two, c); 

     c.gridx = 1; 
     c.gridy = 2; 
     c.gridwidth = 1; 
     c.fill = c.NONE; 
     c.gridheight = 1; 
     c.weightx = 1; 
     c.weighty = 1; 
     c.anchor = c.NORTH; 
     c.insets = new Insets(5,5,5,5); 
     add(twoF, c); 

     c.gridx = 0; 
     c.gridy = 3; 
     c.gridwidth = 1; 
     c.fill = c.NONE; 
     c.gridheight = 1; 
     c.weightx = 1; 
     c.weighty = 1; 
     c.anchor = c.NORTH; 
     c.insets = new Insets(5,5,5,5); 
     add(three, c); 

     c.gridx = 1; 
     c.gridy = 3; 
     c.gridwidth = 1; 
     c.fill = c.NONE; 
     c.gridheight = 1; 
     c.weightx = 1; 
     c.weighty = 1; 
     c.anchor = c.NORTH; 
     c.insets = new Insets(5,5,5,5); 
     add(threeF, c); 

     //setResizable(false); 
     pack(); 
     setVisible(true); 
    } 

} 

ps: - 我是GUI編程的新手,所以請原諒我的任何noob錯誤。

編輯1:這是我完成後我想要的。我知道目前它並不反正看近處是我心目中...我還在修呢enter image description here

感謝

+2

以最小尺寸和更多寬度和高度提供ASCII圖形或簡單的GUI圖形佈局*。 –

回答

1

的想法是加空行/列,將增長到填滿可用空間:

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JTextField; 

public class Frame1 extends JFrame { 

    JLabel one = new JLabel("one"); 
    JLabel two = new JLabel("two"); 
    JLabel three = new JLabel("three"); 

    JTextField oneF = new JTextField(20); 
    JTextField twoF = new JTextField(20); 
    JTextField threeF = new JTextField(20); 

    JMenuBar menuBar = new JMenuBar(); 
    JMenu menu = new JMenu("menu"); 

    public Frame1() { 

     setTitle("GridBagLayout Test"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     GridBagLayout gridBagLayout = new GridBagLayout(); 
     gridBagLayout.rowHeights = new int[]{0, 0, 0, 0}; //this defines 4 rows 
     //make 2 last empty row grow 
     gridBagLayout.rowWeights = new double[]{0.0, 0.0, 1.0,1.0}; 

     //do the same for columns 
     gridBagLayout.columnWidths = new int[]{0, 0, 0, 0}; 
     gridBagLayout.columnWeights = new double[]{0.0, 0.0, 1.0,1.0}; 

     getContentPane().setLayout(gridBagLayout); 

     menuBar.add(menu); 

     GridBagConstraints c = new GridBagConstraints(); 
     c.gridx = 0; 
     c.gridy = 0; 
     c.gridwidth = 5; 
     c.fill = c.HORIZONTAL; 
     c.anchor = c.NORTH; 
     c.insets = new Insets(5, 5, 5, 0); 
     getContentPane().add(menuBar, c); 

     //better have a new GridBagConstraints for each component added 
     GridBagConstraints c1 = new GridBagConstraints(); 
     c1.gridx = 0; 
     c1.gridy = 1; 
     c1.gridwidth = 1; 
     c1.fill = c1.NONE; 
     c1.anchor = c1.NORTH; 
     c1.insets = new Insets(5, 5, 0, 5); 
     getContentPane().add(one, c1); 

     GridBagConstraints c2 = new GridBagConstraints(); 
     c2.gridx = 1; 
     c2.gridy = 1; 
     c2.fill = c2.NONE; 
     c2.anchor = GridBagConstraints.NORTHWEST; 
     c2.insets = new Insets(5, 5, 0, 5); 
     getContentPane().add(oneF, c2); 

     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new Frame1(); 
    } 
} 

編輯:響應您的編輯:使用附加的「成長」一欄爲「封面藝術」

+0

我剛剛運行了你的代碼。我想我可以用這個工作,但是能否請你解釋一下你在創建gridBagLayout後做了什麼。我很難理解你在那裏做了什麼。 謝謝 – aspire29

+0

你是如何使組件不能調整大小並將它們設置在一個地方的? 謝謝 – aspire29

+0

我添加了一些評論。希望能幫助到你。 – c0der

1

我它是如何應該看起來像沒有真正的想法,但你可以嘗試爲文本框設置標籤c.anchor=GridBagConstraints.EASTc.anchor=GridBagConstraints.WEST

也嘗試設置c.fill = GridBadConstraints.BOTH

+0

是否可以在左上方設置所有組件,即使幀被調整大小?謝謝 – aspire29

+0

左上角是c.anchor = GridBagConstraints.EAST –

3
  • 使用嵌套佈局(幾LayoutManager S的組合),您的圖片談論我一下,

  • 仍然可以在我的代碼使用GridBagLayout用於放置到左側的組件,

  • (最簡單的想法是可能的)JComponent S置於在左側不能調整大小,因爲從LayoutManager`s默認限制,更Oracle tutorial

enter image description here

enter image description here

從SSCCE/MCVE

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class MyFrame { 

    private static final long serialVersionUID = 1L; 
    private JFrame myFrame = new JFrame("Whatever"); 
    private JPanel parentPanel = new JPanel(new BorderLayout(10, 10)) { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(600, 400); 
     } 

     @Override 
     public Color getBackground() { 
      return new Color(255, 000, 000); 
     } 
    }; 
    private JPanel leftPanel = new JPanel(/*default is FlowLayout*/) { 

       private static final long serialVersionUID = 1L; 

       @Override 
       public Dimension getPreferredSize() { 
        return new Dimension(300, 400); 
       } 

       @Override 
       public Color getBackground() { 
        return new Color(255, 255, 000); 
       } 
      }; 
    private JPanel leftChildPanel = new JPanel() { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(300, 400); 
     } 

     @Override 
     public Color getBackground() { 
      return new Color(255, 255, 225); 
     } 
    }; 
    private JPanel rightPanel = new JPanel(new BorderLayout(10, 10)) { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(300, 380); 
     } 

     @Override 
     public Color getBackground() { 
      return new Color(000, 255, 225); 
     } 
    }; 

    public MyFrame() { 
     parentPanel.add(leftPanel, BorderLayout.WEST); 
     leftPanel.add(leftChildPanel); 
     parentPanel.add(rightPanel); 
     myFrame.add(parentPanel); 
     myFrame.setLocation(150, 150); 
     myFrame.pack(); 
     myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     myFrame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> { 
      new MyFrame(); 
     }); 
    } 
} 
+0

我只是嘗試了你建議的方式,它修復了所有組件之間的垂直間距。但是,兩列之間的間距比以前更寬(在面板中使用GridBagLayout)。無論如何,我可以解決這個問題嗎? 謝謝 – aspire29

+0

'JComponents'返回它的'getPreferredSize'回到容器(例如'JPanel')和'LayoutManager'可以重新計算,例如在我的代碼示例中減少了'JPanel'維度'public Dimension getPreferredSize() {' – mKorbel

+0

(不能爲newbee配置)你只需要使用自定義的MigLayout,只需要使用一個JPanel,那麼你就可以設置各種方法 – mKorbel

1

的問題是你的c.weightxc.weighty任務畫。 weightx和weighty決定了當容器的容量大於所需的容量時,如何爲GridBagLayout中的網格單元分配多餘的空間以適應組件的首選大小。

對於除窗口變大時想要增大的單元以外的所有單元,weightx和weighty應爲零。

相關問題