2016-01-24 45 views
0

我想获得这两个元素到框架使用GridBagLayout,但只要我将JComboBox添加到GridBagLayout,然后将其添加到框架,JTextFields成为宽度很短,我不知道为什么或如何解决它。当我将JComboBox取出时,它工作得很好,但我确实需要在那里有JComboBox,否则我无法完成该项目。任何帮助如何解决这个问题将不胜感激。下面是代码:问题JTextField和JComboBox在同一个GridBagLayout在Java

package userInterface; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Calendar; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 

public class AddSpend extends JFrame { 

    public AddSpend(){ 
     setTitle("Add New Spend"); 
     setSize(300,200); 
     setVisible(true); 
     setResizable(false); 
     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     setLayout(new GridBagLayout()); 
     create(); 
    } 

    private void create(){ 
     GridBagConstraints c = new GridBagConstraints(); 
     c.gridx = 0; 
     c.gridy = 0; 
     c.anchor = GridBagConstraints.LINE_END; 
     add(new JLabel("Category: "), c); 
     c.gridy++; 
     add(new JLabel("Amount: "), c); 
     c.gridy++; 
     add(new JLabel("Date: "), c); 

     c.gridx = 1; 
     c.gridy = 0; 
     c.anchor = GridBagConstraints.LINE_START; 
     JComboBox<String> category = new JComboBox<String>(); 
     category.addItem("Test 1"); 
     category.addItem("Test 2"); 
     category.addItem("Test 3"); 
     add(category, c); 
     c.gridy++; 
     JTextField amount = new JTextField(); 
     add(amount, c); 
     c.gridy++; 
     JTextField date = new JTextField(); 
     add(date, c); 
     c.gridy++; 
     JButton today = new JButton("Today"); 
     today.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
       Calendar now = Calendar.getInstance(); 
       date.setText((now.get(Calendar.MONTH) + 1) + "/" + now.get(Calendar.YEAR)); 
      } 
     }); 
     today.setFont(today.getFont().deriveFont(7.0f)); 
     today.setPreferredSize(new Dimension(30,15)); 
     add(today, c); 
     c.gridy++; 
     JButton add = new JButton("Add Spend"); 
     add(add, c); 
    } 
} 

回答

2

建议:

  • 摆脱setSize(300,200);pack();替换它通过设置大小,你人为地限制你的GUI到一定大小可能不是最好的自然大小的。在将所有组件添加到GUI之后,通过调用pack(),允许每个组件将自己的大小设置为其自己计算出的最佳大小。
  • 另外,将new JTextField();更改为new JTextField(col_width);其中,col_width是一个int,它是希望JTextField显示的文本列的数量。这将建议JTextField增加其首选大小以容纳col_width字符数。
  • 只有将所有组件的GUI而不是之前还要添加插图到您的GridBagConstraints
  • 呼叫pack()setVisible(true)

例如,

import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Calendar; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class AddSpend extends JPanel { 

    public AddSpend() { 
     create(); 
    } 

    private void create() { 
     setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 

     int ins = 5; 
     c.insets = new Insets(ins, ins, ins, ins); 
     setBorder(BorderFactory.createEmptyBorder(ins, ins, ins, ins)); 

     c.gridx = 0; 
     c.gridy = 0; 
     c.anchor = GridBagConstraints.LINE_END; 
     add(new JLabel("Category: "), c); 
     c.gridy++; 
     add(new JLabel("Amount: "), c); 
     c.gridy++; 
     add(new JLabel("Date: "), c); 

     c.gridx = 1; 
     c.gridy = 0; 
     c.anchor = GridBagConstraints.LINE_START; 
     JComboBox<String> category = new JComboBox<String>(); 
     category.addItem("Test 1"); 
     category.addItem("Test 2"); 
     category.addItem("Test 3"); 
     add(category, c); 
     c.gridy++; 
     JTextField amount = new JTextField(10); 
     add(amount, c); 
     c.gridy++; 
     JTextField date = new JTextField(10); 
     add(date, c); 
     c.gridy++; 
     JButton today = new JButton("Today"); 
     today.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       Calendar now = Calendar.getInstance(); 
       date.setText((now.get(Calendar.MONTH) + 1) + "/" + now.get(Calendar.YEAR)); 
      } 
     }); 
     today.setFont(today.getFont().deriveFont(7.0f)); 
     today.setPreferredSize(new Dimension(30, 15)); 
     add(today, c); 
     c.gridy++; 
     JButton add = new JButton("Add Spend"); 
     add(add, c); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      JFrame frame = new JFrame("Add New Spend"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.add(new AddSpend()); 
      frame.pack(); 
      frame.setResizable(false); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     }); 
    } 
} 

注意,我更喜欢过度的JFrame扩展的JPanel。您可能正在通过让类扩展JFrame来绘制自己的角色,从而迫使您创建和显示JFrame,而且往往需要更多的灵活性。事实上,我敢打赌,我已经创建了大多数Swing GUI代码,而且我已经看到了而不是扩展了JFrame,事实上很少有人会想要这样做。更常见的是,您的GUI类将专门用于创建JPanel,然后可将其放置到JFrame或JDialogs或JTabbedPanes中,或在需要时通过CardLayouts进行交换。这将大大增加您的GUI编码的灵活性。