2012-01-30 87 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); 
      } 
     }); 
    } 
}