Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTextField-setColumns()方法不适用于我_Java_Swing_Jtextfield - Fatal编程技术网

Java JTextField-setColumns()方法不适用于我

Java JTextField-setColumns()方法不适用于我,java,swing,jtextfield,Java,Swing,Jtextfield,我的问题是我的JTextField-setColumns(int) “字段1.设置列(5);” …不起作用。我猜这是布局管理器的问题。然而,我正在从练习本上学习。我只知道flowLayout、borderLayout和gridlayout 简而言之,每当“field2”触发ActionEvent(通过按enter键)时,“field1”的大小应该改变 我在“actionPerformed”中放置了一个“System.out.println”(“ActionEvent detected”),以证明

我的问题是我的JTextField-setColumns(int)

“字段1.设置列(5);”

…不起作用。我猜这是布局管理器的问题。然而,我正在从练习本上学习。我只知道flowLayout、borderLayout和gridlayout

简而言之,每当“field2”触发ActionEvent(通过按enter键)时,“field1”的大小应该改变

我在“actionPerformed”中放置了一个“System.out.println”(“ActionEvent detected”),以证明正在触发ActionEvent,所以这不是问题所在。我甚至打印了“field1.getColumn”,它显示了正确的更改值5,然而……它不仅仅是在运行时无法明显更改大小

我希望有人能解释这个问题,而不是一个变通方法。变通方法不会帮助我学习,这是解决这些书本练习的全部目的

因为这很重要,我正在用netbeans编码。提前感谢您的帮助

public class Exercise13_11 extends JFrame implements ActionListener
{
    private JTextField textField1, textField2;
    private JLabel label1, label2;
    private JRadioButton rButton1, rButton2, rButton3;

    public static void main(String[] args)
    {
        JFrame frame = new Exercise13_11();
        frame.setTitle("Exercise 13.11");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(450, 200);
        frame.setVisible(true);
    }

public Exercise13_11()
{
    // North Panel aligned and filled.
    JPanel northPanel = new JPanel();
    northPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
    northPanel.add(label1 = new JLabel("Text Field"));
    northPanel.add(textField1 = new JTextField(20));
    northPanel.setToolTipText("Demonstrate JTextField");
    getContentPane().add(northPanel, BorderLayout.CENTER);

    // South panel now being filled...
    JPanel southPanel = new JPanel();
        southPanel.setLayout(new FlowLayout());

    JPanel alignmentPanel = new JPanel();
    alignmentPanel.setBorder(
                new javax.swing.border.TitledBorder("Horizontal Alignment"));
    alignmentPanel.add(rButton1 = new JRadioButton("Left"));
    alignmentPanel.add(rButton2 = new JRadioButton("Center"));
    alignmentPanel.add(rButton3 = new JRadioButton("Right"));

    ButtonGroup buttonGroup = new ButtonGroup();
    buttonGroup.add(rButton1);
    buttonGroup.add(rButton2);
    buttonGroup.add(rButton3);

    JPanel columnPanel = new JPanel();
    columnPanel.setBorder(new javax.swing.border.EtchedBorder());
    columnPanel.setLayout(new FlowLayout());
    columnPanel.add(label2 = new JLabel("Column Size"));
    columnPanel.add(textField2 = new JTextField(10));

    southPanel.add(alignmentPanel);
    southPanel.add(columnPanel);
    getContentPane().add(southPanel, BorderLayout.SOUTH);

    textField1.addActionListener(this);
    rButton1.addActionListener(this);
    rButton2.addActionListener(this);
    rButton3.addActionListener(this);        
}

public void actionPerformed(ActionEvent e)
{
    if (e.getSource() == textField1)
    {
        textField1.setColumns(5);
    }
    else if (e.getSource() == rButton1)
            textField1.setHorizontalAlignment(textField1.LEFT);
    else if (e.getSource() == rButton2)
            textField1.setHorizontalAlignment(textField1.CENTER);
    else if (e.getSource() == rButton3)
            textField1.setHorizontalAlignment(textField1.RIGHT);
 }

}

它正在工作,您只需强制容器重新布局其组件。这可以通过调用并发出
重新绘制
请求(以删除任何视觉瑕疵)来实现。

方法
.setColumns()
(与
JFormattedTextField
组件一起使用)无法工作,原因是对放入
JFormattedTextFields
的容器使用了
titleBorder

<container.setBorder(javax.swing.BorderFactory.createTitledBorder("central"));>


更改文本字段的列大小后,尝试添加一个frame.repaint()。这可能是frame没有意识到文本字段已更改的问题,因此它不需要重新绘制。Wicked,我的书中没有介绍validate()。但是去他妈的,一个repaint()本身不起作用。谢谢much@cworner1,即
revalidate()
not validate(),您应该使用它。Netbeans无法识别revalidate()。我猜它不是在Component类中找到的方法。+1这是一个bug(直到今天我才意识到;-)-JTextField应该在设置列时使其自身无效。。。