JTextField 仅在 window 大小更改时更新大小
JTextField only updates size when window size changes
我已经设置了 JTextField
变量,以便在 select 我的复选框使用 ItemListener
变量时更新文本。尽管文本会更新,但大小不会更新,但只会在我最大化或最小化 window 时更新。你知道为什么会这样吗?
这是我的代码:
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JFrame;
import javax.swing.JCheckBox;
import javax.swing.JTextField;
class Fruitbox extends JFrame
{
private JTextField Atext;
private final JCheckBox Abox;
private final JCheckBox Bbox;
private String currentString;
public Fruitbox()
{
super("Hey you da best");
setLayout(new FlowLayout());
Atext = new JTextField("Fruit");
Abox = new JCheckBox("Apple");
Bbox = new JCheckBox("Banana");
add(Abox);
add(Bbox);
add(Atext);
Trigger t = new Trigger();
Abox.addItemListener(t);
Bbox.addItemListener(t);
}
class Trigger implements ItemListener
{
@Override
public void itemStateChanged(ItemEvent e)
{
String S = "Fruit";
if(Abox.isSelected() && Bbox.isSelected())
S = "Apple and Banana";
else if(Abox.isSelected())
S = "Apple";
else if(Bbox.isSelected())
S = "Banana";
else
S = "Fruit";
Atext.setText(S);
}
}
}
class MainFruit
{
public static void main(String[] args)
{
Fruitbox Fruit = new Fruitbox();
Fruit.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Fruit.setSize(300,300);
Fruit.setVisible(true);
}
}
在设置其文本后,您可以通过在侦听器中从包含 JTextField 的容器上调用 revalidate()
来更改 JTextField 的大小,因为这会让您的布局管理器重新布局保留的组件,但总体而言更好是通过使用帮助您设置其列的构造函数来使 JTextField 变大。即,改变这个:
Atext = new JTextField("Fruit");
对此:
Atext = new JTextField("Fruit", 25); // or some suitable value
或更好
// avoid "magic" numbers by using constants and variables
Atext = new JTextField("Fruit", COLUMNS); // where COLUMNS is a constant
请注意,按照约定,变量名应以小写字母开头,遵循这些约定,其他人将更容易理解您的代码。
我已经设置了 JTextField
变量,以便在 select 我的复选框使用 ItemListener
变量时更新文本。尽管文本会更新,但大小不会更新,但只会在我最大化或最小化 window 时更新。你知道为什么会这样吗?
这是我的代码:
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JFrame;
import javax.swing.JCheckBox;
import javax.swing.JTextField;
class Fruitbox extends JFrame
{
private JTextField Atext;
private final JCheckBox Abox;
private final JCheckBox Bbox;
private String currentString;
public Fruitbox()
{
super("Hey you da best");
setLayout(new FlowLayout());
Atext = new JTextField("Fruit");
Abox = new JCheckBox("Apple");
Bbox = new JCheckBox("Banana");
add(Abox);
add(Bbox);
add(Atext);
Trigger t = new Trigger();
Abox.addItemListener(t);
Bbox.addItemListener(t);
}
class Trigger implements ItemListener
{
@Override
public void itemStateChanged(ItemEvent e)
{
String S = "Fruit";
if(Abox.isSelected() && Bbox.isSelected())
S = "Apple and Banana";
else if(Abox.isSelected())
S = "Apple";
else if(Bbox.isSelected())
S = "Banana";
else
S = "Fruit";
Atext.setText(S);
}
}
}
class MainFruit
{
public static void main(String[] args)
{
Fruitbox Fruit = new Fruitbox();
Fruit.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Fruit.setSize(300,300);
Fruit.setVisible(true);
}
}
在设置其文本后,您可以通过在侦听器中从包含 JTextField 的容器上调用 revalidate()
来更改 JTextField 的大小,因为这会让您的布局管理器重新布局保留的组件,但总体而言更好是通过使用帮助您设置其列的构造函数来使 JTextField 变大。即,改变这个:
Atext = new JTextField("Fruit");
对此:
Atext = new JTextField("Fruit", 25); // or some suitable value
或更好
// avoid "magic" numbers by using constants and variables
Atext = new JTextField("Fruit", COLUMNS); // where COLUMNS is a constant
请注意,按照约定,变量名应以小写字母开头,遵循这些约定,其他人将更容易理解您的代码。