2016-01-24 31 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編碼的靈活性。