2017-08-27 132 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应为零。

相关问题