2013-10-13 112 views
0

您好人StackOverflow。我遇到了一個我似乎無法解決的問題。在開始之前,我應該給出一個警告,雖然我不是初學者,但我也不是很高級,所以如果你能夠適當地給出你的答案,那就太棒了。更改JTextField的尺寸

我無法控制JTextField的尺寸,並且我已經使用了我所知道的所有方法。下面的代碼:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 

import javax.swing.BorderFactory; 
import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.JTextField; 

public class ShapeCalculatorView extends JFrame { 

public static void main(String[] args) { 

} 

public ShapeCalculatorView() { 
    init(); 
} 

public void init() { 
    setVisible(true); 
    setTitle("Shape Calculator"); 
    setSize(500, 500); 
    // 
    GridLayout bodyLayout = new GridLayout(1, 2); 
    GridLayout answerLayout = new GridLayout(2, 2); 

    JPanel mainPanel = new JPanel(); 
    mainPanel.setLayout(new BorderLayout()); 
    mainPanel.setBorder(BorderFactory.createLineBorder(Color.red)); 
    // 
    JPanel bodyPanel = new JPanel(); 
    bodyPanel.setLayout(bodyLayout); 
    bodyPanel.setBorder(BorderFactory.createLineBorder(Color.blue)); 
    mainPanel.add(bodyPanel, BorderLayout.PAGE_START); 

    JPanel resultPanel = new JPanel(); 
    resultPanel.setLayout(bodyLayout); 
    mainPanel.add(resultPanel, BorderLayout.PAGE_END); 

    JPanel buttonPanel = new JPanel(); 
    buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS)); 
    bodyPanel.add(buttonPanel); 
    JRadioButton buttonOne = new JRadioButton("Button 1"); 
    JRadioButton buttonTwo = new JRadioButton("Button 2"); 
    JRadioButton buttonThree = new JRadioButton("Button 3"); 
    JRadioButton buttonFour = new JRadioButton("Button 4"); 
    JRadioButton buttonFive = new JRadioButton("Button 5"); 
    buttonPanel.add(buttonOne); 
    buttonPanel.add(buttonTwo); 
    buttonPanel.add(buttonThree); 
    buttonPanel.add(buttonFour); 
    buttonPanel.add(buttonFive); 

    String textLength = "Length: "; 
    String textWidth = "Width: "; 

    JPanel inputPanel = new JPanel(); 
    inputPanel.setLayout(answerLayout); 
    bodyPanel.add(inputPanel); 
    JTextField fieldOne = new JTextField(); 
    JTextField fieldTwo = new JTextField(); 
    fieldOne.setPreferredSize(new Dimension(100, 2)); 
    inputPanel.add(new JLabel(textLength)); 
    inputPanel.add(fieldOne); 
    inputPanel.add(new JLabel(textWidth)); 
    inputPanel.add(fieldTwo); 

    JPanel calcPanel = new JPanel(); 
    resultPanel.add(calcPanel); 
    JButton calcButton = new JButton("CALCULATE"); 
    calcPanel.add(calcButton); 

    JPanel answerPanel = new JPanel(); 
    answerPanel.setLayout(answerLayout); 
    resultPanel.add(answerPanel); 
    answerPanel.add(new JLabel("Perimeter: ")); 
    answerPanel.add(new JLabel("Area: ")); 
    long perimeter = 5; 
    long area; 

    add(mainPanel); 
    pack(); 
} 

} 
public class ShapeCalculatorApp { 

public static void main(String[] args) { 
    ShapeCalculatorView view = new ShapeCalculatorView(); 

} 

} 

如果要運行這個,你會發現一切只是文本字段是相當高的罰款,我想他們是有點小。我已經嘗試setPreferredSize,並沒有工作,我懷疑這可能是因爲我使用GridLayout,因此兩個文本字段用盡所有空間,所以setPreferredSize將無法正常工作。我也想過,也許我可以將行數設置爲3,然後在第二行中放置2個空JLabel,但這似乎是處理這個問題的一種原始方式。有沒有這樣做的有效方式?

編輯:如果它很重要,我可以用setPreferredSize控制textfields的寬度,而不是高度。

回答

2

請勿直接將JTextField添加到GridLayout,因爲這會強制組件拉伸以填充單元格。而是將其放入JPanel中,或者使用嵌套佈局來實現GUI。

例如(一個可怕的例子,但一個使用你的代碼):

final JTextField fieldOne = new JTextField(10); 
    final JTextField fieldTwo = new JTextField(10); 
    // fieldOne.setPreferredSize(new Dimension(100, 2)); 
    inputPanel.add(new JLabel(textLength)); 
    inputPanel.add(new JPanel() { 
    { 
     add(fieldOne); 
     setBorder(BorderFactory.createTitledBorder("Field 1")); 
    } 
    }); 
    inputPanel.add(new JLabel(textWidth)); 
    inputPanel.add(new JPanel() { 
    { 
     add(fieldTwo); 
     setBorder(BorderFactory.createTitledBorder("Field 2")); 
    } 
    }); 
+0

只是澄清所以你說,如果我把文本字段到一個JLabel,並把一個JLabel到一個JPanel,我將能夠改變與了setPreferredSize的尺寸? – oopsidoodles

+0

@ViliMilner:我不會把JTextField放到JLabel中,至少不是常用的,但更經常地放到另一個JPanel中。 –

+0

@ViliMilner:看例子。請注意,如果它是我的GUI,我不會以此方式對其進行編碼。 –

0

雖然我不喜歡這個答案,我覺得我應該把它放在這裏的人誰絆倒了同樣的問題我有。解決此問題的一種方法是更改​​GridLayout中的行數並在您認爲合適的地方添加空JLabel。這是一個偏好問題,您希望JTextFields的位置以及您希望它們的多小。代碼 一塊其實我編輯:

GridLayout gridFiveTwo = new GridLayout(5, 2); 

然後是部分whee我把中的JLabel。

JPanel inputPanel = new JPanel(); 
    inputPanel.setLayout(gridFiveTwo); 
    bodyPanel.add(inputPanel); 
    JTextField fieldOne = new JTextField(); 
    JTextField fieldTwo = new JTextField(); 
    inputPanel.add(new JLabel(textLength)); 
    inputPanel.add(fieldOne); 
    inputPanel.add(new JLabel(textWidth)); 
    inputPanel.add(fieldTwo); 
    inputPanel.add(new JLabel("")); 
    inputPanel.add(new JLabel("")); 
    inputPanel.add(new JLabel("")); 
    inputPanel.add(new JLabel("")); 
    inputPanel.add(new JLabel("")); 
    inputPanel.add(new JLabel("")); 

我不喜歡這個答案,並希望有人知道這樣做的更好的辦法,但在此期間,這是我使用的是什麼。

0

將佈局管理器設置爲空。然後,您可以使用.setSize屬性來設置組件/ jTextfields的大小。

this.setLayout(null);   //set this in your constructor 

jTextField1.setSize(20, 200); // whatever you prefer