2013-10-13 93 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