有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java更改JTextField的维度

大家好,斯塔克沃夫的人们。我遇到了一个似乎无法解决的问题。在我开始之前,我应该警告一下,虽然我不是初学者,但我也不是非常高级,所以如果你能恰当地说出你的答案,那就太好了

我无法控制JTextFields的大小,我已经使用了我知道的所有方法。代码如下:

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控制文本字段的宽度,而不是高度


共 (3) 个答案

  1. # 1 楼答案

    将布局管理器设置为空。然后你就可以使用。setSize属性设置组件/jTextfields的大小

    this.setLayout(null);         //set this in your constructor
    
    jTextField1.setSize(20, 200); // whatever you prefer
    
  2. # 2 楼答案

    虽然我不喜欢这个答案,但我觉得我应该把它放在这里,给那些遇到我遇到的同样问题的人。解决此问题的一种方法是更改GridLayout中的行数,并在您认为合适的位置添加空JLabel。这里是一个偏好的问题,您希望JTextFields在哪里,以及希望它们有多小。 我实际编辑的一段代码:

    GridLayout gridFiveTwo = new GridLayout(5, 2);
    

    然后是我放在桌子上的那部分

        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(""));
    

    我不喜欢这个答案,希望有人知道一个更好的方法,但同时这就是我正在使用的

  3. # 3 楼答案

    不要直接将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"));
         }
      });