2012-01-16 30 views
4

私の問題は私のJTextFieldの-setColumns(int型)のJTextField - setColumns()メソッドは、私のために働いていない

ということです "field1.setColumns(5);"

...は機能しません。私はそのレイアウトマネージャの問題を推測しています。しかし、私はエクササイズブックから学んでいます。私が知っている唯一のレイアウトは、flowLayout、borderLayout、およびgridlayoutです。

このコードを簡単に説明すると、「field2」が(Enterキーを押して)ActionEventをトリガするたびに、「field1」はサイズを変更する必要があります。

"actionPerformed"に "System.out.println(" ActionEvent detected ")を配置して、アクションイベントが発生していることを証明しました。問題はありません。しかし、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); 
} 

}

+0

TextFieldの列サイズを変更した後に、frame.repaint()を追加してみてください。テキストフィールドが変更されたことを気付かないFrameの問題かもしれないので、それを再描画する必要はありません。 – aoi222

+0

残念ながら、それはうまくいかなかった...しかし、あなたの意見ではない。 – cworner1

+0

@ cworner1、それは動作しましたか? – mre

答えて

5

それは働いて、あなただけ再びそのコンポーネントをレイアウトするコンテナを強制する必要があります。これは、revalidateを呼び出してから、repaint要求(視覚的な成果物を削除する)を発行することで実現できます。

+0

Wicked、私は私の本でvalidate()をカバーしていません。しかし、それをねじ込むと、塗り直し()自体は機能しませんでした。ありがとうございました – cworner1

+0

の説明+1 – mKorbel

+0

@ cworner1、それは 'revalidate()'があなたが使用すべきであることを検証していません。 – camickr

関連する問題