2012-05-27 47 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