2012-01-30 151 views
1

我有一個GUI,它基於Swing的JPanel使用BorderLayout。在北面板中,我添加了一個使用FlowLayout幷包含兩個textField和其他組件的新JPanel。 當我更改textField的文本並隱藏此面板中的某些組件時,此textField不斷調整大小。我怎樣才能避免這種情況?我希望textField能夠保持相同的大小。我試過setSize,setPreferredSize,setMinimumSize沒有成功。如何禁用java swing中textField的大小調整?

txtSource = new WebTextField(source); 
    txtSource.setMaximumSize(new Dimension(30,20)); 
    txtSource.setMinimumSize(new Dimension(20, 20)); 
    txtSource.setEditable(false); 
    txtDestination = new WebTextField(destination); 
    txtDestination.setMaximumSize(new Dimension(30,20)); 
    txtDestination.setMinimumSize(new Dimension(20, 20)); 

前: enter image description here

後: enter image description here

+2

使用的FlowLayout導致組件大小調整。嘗試另一種佈局。 – xyz 2012-01-30 12:07:31

+0

可能的重複 - http://stackoverflow.com/questions/6492794/swing-component-disabling-resize-in-layout – mre 2012-01-30 12:28:05

+1

一般規則是_never_使用setXXSize(使用XX = min/pref/max)。相反,請使用適當的LayoutManager。假設WebTextField是JTextField的一個子類,你可以用「列」(大致字符數)來設置配置它的prefSize。 – kleopatra 2012-01-30 13:16:45

回答

0

你不能做到這一點像你想要什麼,有些LayoutManagers忽略setXxxSize,但您可以使用F.E. BoxLayout用於setXxxSize

+1

-1佈局管理器不會「接受」setXXSize - 相反,它們使用尺寸提示(不管它們是由應用程序代碼錯誤地設置還是內部正確計算)來調整尺寸/位置正如他們的api文檔所記錄的(糟糕的;-) – kleopatra 2012-01-30 13:20:57

7

當我改變文本框的這個面板中的文本和無形的一些成品的配件接受,這個文本框不斷調整。

這個例子顯示了恆定大小的文本字段。你可以添加一個SSCCE的代碼嗎?

Text Field Size

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

class TextFieldSize { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JTextField smallField = new JTextField(5); 
       JTextField largeField = new JTextField(20); 
       JPanel gui = new JPanel(new FlowLayout()); 
       gui.add(smallField); 
       gui.add(largeField); 
       JFrame f = new JFrame("Text Field Size"); 
       f.add(gui); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.pack(); 
       f.setLocationByPlatform(true); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 
0
//This works best for me: 

import java.awt.Dimension; 

import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class NoResizeJTextField { 
    public static void main(String[] args) { 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setPreferredSize(new Dimension(500,300)); 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); 
     panel.add(new JLabel("Text: ")); 
     JTextField tf = new JTextField(30); 
     tf.setMaximumSize(tf.getPreferredSize()); 
     tf.setMinimumSize(tf.getPreferredSize()); 
     panel.add(tf); 
     frame.add(panel); 
     SwingUtilities.invokeLater(new Runnable() {    
      public void run() { 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
}