2012-07-15 88 views
3

有人可以請幫我在運行時如何設置一個JTextField的寬度?我希望我的文本字段在運行時調整大小。它會詢問用戶的長度,然後輸入將改變文本字段的寬度。如何在運行時設置JTextField的寬度?

if(selectedComponent instanceof javax.swing.JTextField){ 
    javax.swing.JTextField txtField = (javax.swing.JTextField) selectedComponent; 
    //txtField.setColumns(numInput); //tried this but it doesn't work 
    //txtField.setPreferredSize(new Dimension(numInput, txtField.getHeight())); //also this 
    //txtField.setBounds(txtField.getX(), txtField.getY(), numInput, txtField.getHeight()); 
    //and this 
    txtField.revalidate(); 
} 

我使用null佈局這一點,因爲我在編輯模式。

回答

5

您只需使用jTextFieldObject.setColumns(int columnSize)。這會讓你在運行時增加它的大小。您在最後無法完成的原因是null佈局。這是爲什麼不鼓勵使用null Layout/Absolute Positioning的主要原因之一。下面是在嘗試你的手一個小例子:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class JTextFieldExample 
{ 
    private JFrame frame; 
    private JPanel contentPane; 
    private JTextField tfield; 
    private JButton button; 
    private int size = 10; 

    private ActionListener action = new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 
      String input = JOptionPane.showInputDialog(
           frame, "Please Enter Columns : " 
               , String.valueOf(++size)); 
      tfield.setColumns(Integer.parseInt(input));     
      contentPane.revalidate(); 
      contentPane.repaint(); 
     } 
    }; 

    private void createAndDisplayGUI() 
    { 
     frame = new JFrame("JTextField Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   

     contentPane = new JPanel(); 
     contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5)); 

     tfield = new JTextField(); 
     tfield.setColumns(size); 

     JButton button = new JButton("INC Size"); 
     button.addActionListener(action); 

     contentPane.add(tfield); 
     contentPane.add(button); 

     frame.getContentPane().add(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new JTextFieldExample().createAndDisplayGUI(); 
      } 
     }); 
    } 
} 

對於你需要呼籲JTextFieldsetSize()爲了獲得結果,但你應該始終牢記之所以這種做法是絕對定位的情況下氣餒,如Java Doc's第一段所述。

+2

哦。 :(在編輯之前,我真的很喜歡這個答案,說.. *「絕對定位..」* Eeek!讓我們不要讓新手走向瘋狂和怪物的道路哦,好吧,無論如何+1 :) – 2012-07-15 04:05:06

+0

+ 1我的答案有效,但這樣更好/更徹底 – 2012-07-15 04:10:21

+0

@AndrewThompson:Thankx指出我的錯誤,因此我對上述方向做了一些更改:-) – 2012-07-15 04:55:49

2

我只是通過使用setBounds來調整文本字段的大小。看看下面的例子:

import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.JButton; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 


public class Resize extends JFrame{ 
    public JTextField jtf = new JTextField(); 

    public Resize(){ 
    //frame settings 
    setTitle("Resizable JTextField"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLayout(null); 
    setSize(new Dimension(600,400)); 
    setResizable(false); 

    //init and add text field to the frame 
    add(jtf); 
    jtf.setBounds(20,50,200,200); 

    //button to change text field size 
    JButton b = new JButton("Moar."); 
    add(b); 
    b.setBounds(20,20,b.getPreferredSize().width,b.getPreferredSize().height); 
    b.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent evt){ 
      jtf.setBounds(20,50,jtf.getSize().width+10,jtf.getSize().height); //THIS IS WHERE THE RESIZING HAPPENS 
     } 
     }); 

    setVisible(true); 
    } 
    public static void main(String[] args){ 
    Resize inst = new Resize(); 
    } 
} 
+0

+1另一個選擇:-) – 2012-07-15 04:54:15

+0

-1爲空佈局和手動調整大小 - 不管是什麼問題,這不是解決方案 – kleopatra 2012-07-15 08:49:13

+0

@kleopatra夠公平的,儘管OP表示他們想使用'null'佈局 – 2012-07-15 15:47:32

相關問題