2012-05-27 53 views
0

摆动的另一个问题。如果其中一个更改大小,我怎样才能阻止GridBagLayout从respacing组件中移出?例如,我有几列,其中一列有一个带有文本“文本”的JLabel。当我将其更改为“texttext”时,布局管理器会调整整个列的大小。我不希望它那样做。有什么办法可以预防它吗?阻止GridBagLayout调整列大小

实施例:

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

public class ResizeIssue { 

static int value = 99; 

public static void main(String[] args) { 

    JFrame frame = new JFrame(); 
    final JLabel valueLabel = new JLabel(String.valueOf(value)); 
    JButton decButton = new JButton("-"); 
    decButton.addActionListener(new java.awt.event.ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent ae) { 
      valueLabel.setText(String.valueOf(--value)); 
     } 
    }); 

    JButton incButton = new JButton("+"); 
    incButton.addActionListener(new java.awt.event.ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent ae) { 
      valueLabel.setText(String.valueOf(++value)); 
     } 
    }); 

    JPanel panel = new JPanel(); 
    panel.setLayout(new GridBagLayout()); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.weightx = 1; 
    c.gridx = 0; 
    c.gridy = 0; 
    panel.add(decButton, c); 
    c.gridx = 1; 
    panel.add(valueLabel, c); 
    c.gridx = 2; 
    panel.add(incButton, c); 

    frame.add(panel); 
    frame.pack(); 
    frame.setVisible(true); 
    } 
} 

它是可见的,而9 - > 10或随时改变文本宽度。

+0

为更好地帮助更快地编辑问题与[SSCCE](http://sscce.org/),展示您的问题调整大小 – mKorbel

回答

2

GridBagLayout忽略最大宽度/高度。有没有简单的方法来设置JLabel的最大尺寸。

但是,我认为你真正想要的是当JLabel中的文本改变时,布局不会移动。

这可以通过使JLabel足够宽以保持其需要显示的最大值来完成。例如:

jLabel1.setFont(new Font("monospace", Font.PLAIN, 12)); 
    FontMetrics fm = jLabel1.getFontMetrics(jLabel1.getFont()); 
    int w = fm.stringWidth("0000"); 
    int h = fm.getHeight(); 
    Dimension size = new Dimension(w, h); 
    jLabel1.setMinimumSize(size); 
    jLabel1.setPreferredSize(size); 

更新:

要居中标签文本,只需添加:

jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
+0

这只能部分解决问题,因为如果我这样做,文本不在按钮之间的空间居中(如果'mask'是xx,一位数字是9x,x不可见,但占用空间)。 – joval

+0

@update:天哪,没有想到它,它在这种情况下工作。我仍然有类似的情况与长文本,但该按钮仍然移动一点。 – joval

+1

@joval它只是归结为调整JLabel的大小,使其不需要增长以容纳将要显示的文本。如果你没有文本控制,那么切换到JScrollPane中的JTextArea。 –

1

这可能会实现:

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

public class ResizeIssue2 { 
    static int value = 99; 
    public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    final JLabel valueLabel = new JLabel(String.valueOf(value)); 
    JButton decButton = new JButton("-"); 
    decButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      valueLabel.setText(String.valueOf(--value)); 
     } 
    }); 

    JButton incButton = new JButton("+"); 
    incButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      valueLabel.setText(String.valueOf(++value)); 
     } 
    }); 

    JPanel panel = new JPanel(); 
    panel.setLayout(new GridBagLayout()); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.weightx = 1; 
    c.gridx = 0; 
    c.gridy = 0; 
    panel.add(decButton, c); 
    c.gridx = 1; 
    panel.add(valueLabel, c); 
    c.gridx = 2; 
    panel.add(incButton, c); 

    //* 
    c.gridy = 1; 
    int w = 32; //incButton.getPreferredSize().width; 
    for(c.gridx=0;c.gridx<3;c.gridx++) { 
     panel.add(Box.createHorizontalStrut(w), c); 
    } 
    // */ 

    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    frame.add(panel); 
    frame.pack(); 
    frame.setVisible(true); 
    } 
} 
+0

那么,按钮标签按钮只是我的对话框的一部分,有四行和一个类似的下方,所以我不能添加任何东西。尝试类似的块,但不起作用。 – joval