你好StackOverflow的人。我遇到了一个我似乎无法解决的问题。在我开始之前,我应该发出警告,虽然我不是初学者,但我也不是非常先进,所以如果你能恰当地说出你的答案,那就太好了。
我无法控制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控制文本字段的宽度,而不是高度。
答案 0 :(得分: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"));
}
});
答案 1 :(得分:0)
虽然我不喜欢这个答案,但我觉得我应该把它放在任何遇到同样问题的人身上。解决此问题的方法是更改GridLayout中的行数,并在您认为合适的位置添加空JLabel。在这里,这是一个偏好问题,你想要JTextFields以及你想要它们有多小。 我实际编辑过的一段代码:
GridLayout gridFiveTwo = new GridLayout(5, 2);
然后是我放入JLabels的部分。
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(""));
我不喜欢这个答案,希望有人知道更好的方法,但与此同时这就是我正在使用的。
答案 2 :(得分:0)
将布局管理器设置为null。然后,您可以使用.setSize属性来设置components / jTextfields的大小。
this.setLayout(null); //set this in your constructor
jTextField1.setSize(20, 200); // whatever you prefer