2016-10-12 36 views
1

在我正在写的程序中,我希望有10个文本字段垂直对齐。 相反,我得到这样的:Swing GridBagLayout行事

What it looks like

代码在这里:

import java.awt.*; 
import java.util.Random; 
import javax.swing.*; 
import java.awt.event.*; 

public class Gsb extends JFrame { 

    JTextField word1; 
    JTextField word2; 
    JTextField word3; 
    JTextField word4; 
    JTextField word5; 
    JTextField word6; 
    JTextField word7; 
    JTextField word8; 
    JTextField word9; 
    JTextField word10; 
    JButton gofor; 
    JButton rego; 
    JTextArea Stuff; 
    JPanel panel; 
    JPanel texts; 
    JPanel buttons; 
    JButton Quit; 
    JPanel bigt; 
    String[] words = new String[20]; 
    static int[] randnums = new int[20]; 

    int i = 0; 

    public static void main(String[] args) { 

     new Gsb(); 
     Random Rand = new Random(); 

     int counter = 0; 
     int rand; 
     int[] pick = new int[20]; 
     for(int i = 0; i < 20; i++) 
     { 
      rand = Rand.nextInt(20) + 1; 
      if (CheckForDuplicate(pick, rand, counter)) 
      { 
       pick[i] = rand; 
       counter++; 
      } 
      else 
      { 
       i--; 
      } 
     } 
     for(int p = 0; p < 20; p++) { 
      randnums[p] = pick[p] - 1; 
     } 
    } 

    static boolean CheckForDuplicate(int[] array, int number, int counter) 
    { 
     for (int i = 0; i < counter; i++) 
     { 
      if (array[i] == number) 
      { 
       return false; 
      } 
     } 

     return true; 
    } 

    public Gsb() { 

     Toolkit tk = Toolkit.getDefaultToolkit(); 
     Dimension dim = tk.getScreenSize(); 

     int xPos = (dim.width/2) - (this.getWidth()/2); 
     int yPos = (dim.height/2) - (this.getHeight()/2); 
     this.setLocation(xPos, yPos); 
     GridBagConstraints c = new GridBagConstraints(); 
     GridBagConstraints d = new GridBagConstraints(); 
     this.setSize(500, 500); 
     this.setTitle("checker"); 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     panel = new JPanel(); 
     texts = new JPanel(); 
     buttons = new JPanel(); 
     bigt = new JPanel(); 
     word1 = new JTextField(10); 
     word2 = new JTextField(10); 
     word3 = new JTextField(10); 
     word4 = new JTextField(10); 
     word5 = new JTextField(10); 
     word6 = new JTextField(10); 
     word7 = new JTextField(10); 
     word8 = new JTextField(10); 
     word9 = new JTextField(10); 
     word10 = new JTextField(10); 
     gofor = new JButton("BONANZA!"); 
     rego = new JButton("Restart"); 
     Stuff = new JTextArea(40, 40); 
     Quit = new JButton("Exit"); 
     Stuff.setLineWrap(true); 
     Stuff.setWrapStyleWord(true); 
     Stuff.setText("welcome to the google search bonanza! first user write 10 random words and press BONANZA!"); 
     JScrollPane useless = new JScrollPane(Stuff, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     panel.setLayout(new GridBagLayout()); 
     texts.setLayout(new GridBagLayout()); 
     buttons.setLayout(new GridBagLayout()); 
     bigt.setLayout(new GridBagLayout()); 
     c.fill = GridBagConstraints.CENTER; 
     d.fill = GridBagConstraints.RELATIVE; 

     d.gridx = 0; 
     d.gridy = 0; 
     texts.add(word1, d); 
     d.gridx = 0; 
     d.gridy = 1; 
     texts.add(word2, d); 
     d.gridx = 0; 
     d.gridy = 2; 
     texts.add(word3, d); 
     d.gridx = 0; 
     d.gridy = 3; 
     texts.add(word4, d); 
     d.gridx = 0; 
     d.gridy = 4; 
     texts.add(word5, d); 
     d.gridx = 0; 
     d.gridy = 5; 
     texts.add(word6, d); 
     d.gridx = 0; 
     d.gridy = 6; 
     texts.add(word7, d); 
     d.gridx = 0; 
     d.gridy = 7; 
     texts.add(word8, d); 
     d.gridx = 0; 
     d.gridy = 8; 
     texts.add(word9, d); 
     d.gridx = 0; 
     d.gridy = 9; 
     texts.add(word10); 
     c.gridx = 10; 
     c.gridy = 0; 
     buttons.add(gofor,c); 
     c.gridx = 9; 
     c.gridy = 0; 
     buttons.add(Quit,c); 
     c.gridx = 8; 
     c.gridy = 0; 
     buttons.add(rego ,c); 
     Bonanza bonanzer = new Bonanza(); 
     Bonanzatwo bon2 = new Bonanzatwo(); 
     Reset Reseter = new Reset(); 
     Exit Exiter = new Exit(); 
     rego.addActionListener(Reseter); 
     gofor.addActionListener(bonanzer); 
     gofor.addActionListener(bon2); 
     Quit.addActionListener(Exiter); 
     bigt.add(Stuff); 
     c.gridheight = 20; 
     c.gridx = 0; 
     c.gridy = 0; 
     panel.add(texts, c); 

     panel.add(buttons); 


     panel.add(bigt); 
     panel.add(useless); 
     this.add(panel); 
     this.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     this.setUndecorated(true); 
     this.setVisible(true); 
     this.setTitle("The Google search bonanza"); 
    } 

基本上,如果它是不明确的,我去的是这样的:

What I'm going for

+0

1)为了更好地帮助更快,发布[MCVE]或[短,自包含,正确示例](http://www.sscce.org/)。 2)使用合乎逻辑的一致形式缩进代码行和块。缩进旨在使代码的流程更易于遵循! 3)替换'Toolkit tk = Toolkit.getDefaultToolkit(); .. this.setLocation(xPos,yPos);''与'this.setLocationRelativeTo(null);'同样的效果。或更好。 'this.setLocationByPlatform(true);'.. –

+0

.. 4)以最小尺寸提供ASCII图形或简单的*图形布局*,如果可调整大小,则具有更大的宽度和高度。 **后者**显示应该如何分配额外的空间。 –

+0

谢谢,下次我会记住这一点! –

回答

2

唐当你想创建一个网格物体时,不要使用GridBagLayout - 使用GridLayout,这里有1列和0(fo r可变数量)行。你可以为JTextFields创建一个JPanel,给它一个GridLayout,然后如果你愿意,可以使用GridBagLayout将这个JPanel添加到主GUI,但是这里的关键是嵌套JPanel,每个JPanel使用它自己的布局。

其他建议,当我看到这样的变量:

JTextField word1; 
JTextField word2; 
JTextField word3; 
JTextField word4; 
JTextField word5; 
JTextField word6; 
JTextField word7; 
JTextField word8; 
JTextField word9; 
JTextField word10; 

我认为,没有她真的想在这里使用数组或ArrayList的?或者也许是一个JTable。

此外,您将JTextArea添加到JScrollPane,但是然后将JTextArea而不是JScrollPane添加到GUI。

例如:

import java.awt.BorderLayout; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.*; 

public class Gsb2 extends JPanel { 
    private static final int WORD_FIELD_COUNT = 10; 
    private static final int COL_SIZE = 10; 
    private static final int TA_ROWS = 40; 
    private static final int TA_COLS = 40; 
    private JTextField[] wordFields = new JTextField[WORD_FIELD_COUNT]; 
    private int rows; 
    private JTextArea stuffArea = new JTextArea(TA_ROWS, TA_COLS); 

    public Gsb2() { 
     JPanel wordFieldsPanel = new JPanel(new GridLayout(0, 1)); 
     for (int i = 0; i < wordFields.length; i++) { 
      wordFields[i] = new JTextField(COL_SIZE); 
      wordFieldsPanel.add(wordFields[i]); 
     } 

     JPanel wrapWordFieldsPanel = new JPanel(new GridBagLayout()); 
     wrapWordFieldsPanel.add(wordFieldsPanel); 

     JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0)); 
     buttonPanel.add(new JButton(new MyAction("Restart", KeyEvent.VK_R))); 
     buttonPanel.add(new JButton(new MyAction("Exit", KeyEvent.VK_X))); 
     buttonPanel.add(new JButton(new MyAction("BONANZA!", KeyEvent.VK_B))); 

     JScrollPane scrollPane = new JScrollPane(stuffArea); 

     JPanel rightPanel = new JPanel(new BorderLayout(5, 5)); 
     rightPanel.add(wrapWordFieldsPanel, BorderLayout.CENTER); 
     rightPanel.add(buttonPanel, BorderLayout.PAGE_END); 

     setLayout(new BorderLayout(5, 5)); 
     setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     add(rightPanel, BorderLayout.LINE_START); 
     add(scrollPane, BorderLayout.CENTER); 

    } 

    private class MyAction extends AbstractAction { 
     public MyAction(String name, int mnemonic) { 
      super(name); 
      putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO add code 

     } 
    } 

    private static void createAndShowGui() { 
     Gsb2 mainPanel = new Gsb2(); 

     JFrame frame = new JFrame("Gsb2"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

OK,OK,到 “匹配规范”,使用BoxLayout的:

import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.*; 

public class Gsb3 extends JPanel { 
    private static final int WORD_FIELD_COUNT = 10; 
    private static final int COL_SIZE = 10; 
    private static final int TA_ROWS = 40; 
    private static final int TA_COLS = 40; 
    private JTextField[] wordFields = new JTextField[WORD_FIELD_COUNT]; 
    private int rows; 
    private JTextArea stuffArea = new JTextArea(TA_ROWS, TA_COLS); 

    public Gsb3() { 
     JPanel wordFieldsPanel = new JPanel(new GridLayout(0, 1)); 
     for (int i = 0; i < wordFields.length; i++) { 
      wordFields[i] = new JTextField(COL_SIZE); 
      wordFieldsPanel.add(wordFields[i]); 
     } 

     JPanel wrapWordFieldsPanel = new JPanel(new GridBagLayout()); 
     wrapWordFieldsPanel.add(wordFieldsPanel); 

     JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0)); 
     buttonPanel.add(new JButton(new MyAction("Restart", KeyEvent.VK_R))); 
     buttonPanel.add(new JButton(new MyAction("Exit", KeyEvent.VK_X))); 
     buttonPanel.add(new JButton(new MyAction("BONANZA!", KeyEvent.VK_B))); 
     buttonPanel.setMaximumSize(buttonPanel.getPreferredSize()); 

     JScrollPane scrollPane = new JScrollPane(stuffArea); 

     setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS)); 
     setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     add(wrapWordFieldsPanel); 
     add(Box.createHorizontalStrut(5)); 
     add(buttonPanel); 
     add(Box.createHorizontalStrut(5)); 
     add(scrollPane); 

    } 

    private class MyAction extends AbstractAction { 
     public MyAction(String name, int mnemonic) { 
      super(name); 
      putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO add code 

     } 
    } 

    private static void createAndShowGui() { 
     Gsb3 mainPanel = new Gsb3(); 

     JFrame frame = new JFrame("Gsb2"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+1

我更喜欢这种代码将按钮放在文本字段下方的方式,但请注意它与“规范”不匹配。在上面看到(第二)图像。 –

+1

@AndrewThompson:明白了。请参阅使用BoxLayout的编辑。 –

+1

Pft ..现在你让我想要再次投票。 ;) –