2017-04-14 59 views
0

我是Java Swing的新手,正在開發一個項目,以幫助我更熟悉它。我注意到在更改標籤文本時,GridBagLayou t中的單元格增加/減少(可以通過邊界線調整大小)。我想知道是否有辦法鎖定ipad大小,所以它不會改變(設置後)。有沒有辦法鎖定ipad尺寸?GridBagConstraints ipad鎖大小

下面是圖像,所以你可以看到我在說什麼。

前:

enter image description here

後:

enter image description here

注意標籤當一個數字被置於如果一個兩位數放在如何縮小,標籤。 (大於「 - 」標籤)

這裏是代碼:

import javax.swing.*; 
import javax.swing.border.Border; 
import javax.swing.border.TitledBorder; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class StartGuiTest extends JFrame implements ActionListener { 
    private static final int unselectedDefaultElement = 0; 
    private static final String unselectedLvl = "- -"; 
    private static final int maxLvl = 99; 
    private static final String[] GuiCharSel = {"--- Select Character ---", "Cloud", "Barret", "Tifa", "Aeris", "Red XIII", "Yuffie", "Cait Sith", "Vincent", "Cid"}; 
    private String[] lvlRange = createArrRange(unselectedLvl, 1, maxLvl); 

    /* 
    * Interactive GUI Objects 
    */ 
    JLabel charPic; 
    JComboBox charSelCombo = new JComboBox(GuiCharSel); 
    JComboBox pickLvlAns = new JComboBox(lvlRange); 
    JLabel nextLvlAns = new JLabel(unselectedLvl); 

    public StartGuiTest() { 
     JPanel topFrame = new JPanel(); 
     JPanel bottomFrame = new JPanel(); 
     JPanel selPane = new JPanel(); 
     JLabel pickLvl = new JLabel("Pick Current Level:"); 
     JLabel nextLvl = new JLabel("Next Level:"); 

     TitledBorder topFrameTitle; 
     Border blackLine = BorderFactory.createLineBorder(Color.black); 
     Border raisedBevel = BorderFactory.createRaisedBevelBorder(); 
     Border loweredBevel = BorderFactory.createLoweredBevelBorder(); 
     Border compound = BorderFactory.createCompoundBorder(raisedBevel, loweredBevel); 
     topFrameTitle = BorderFactory.createTitledBorder(compound, "Character"); 
     topFrameTitle.setTitleJustification(TitledBorder.CENTER); 
     topFrame.setBorder(topFrameTitle); 
     topFrame.setLayout(new BoxLayout(topFrame, BoxLayout.X_AXIS)); 

     /* 
     * Adds Character Picture 
     */ 
     charPic = new JLabel("", null, JLabel.CENTER); 
     charPic.setPreferredSize(new Dimension(100,100)); 
     topFrame.add(charPic); 

     //******************************************************************************* 

     /* 
     * Selection Pane Settings 
     */ 
     selPane.setLayout(new GridBagLayout()); 

     /* 
     * Adds Character Selection ComboBox 
     */ 
     charSelCombo.setPrototypeDisplayValue(charSelCombo.getItemAt(unselectedDefaultElement)); 
     selPane.add(charSelCombo, setGbc(0,0, 0, 0, "WEST", 0, 1, setInsets(0, 10, 0, 0))); 
     charSelCombo.addActionListener(
       new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         charSelCombo.removeItem(GuiCharSel[unselectedDefaultElement]); 
         pickLvlAns.removeItem(lvlRange[unselectedDefaultElement]); 
        } 
       } 
     ); 

     /* 
     * Adds "Pick Current Level:" Label 
     */ 
     selPane.add(pickLvl, setGbc(0,1, 0, 0, "EAST", 0, 1, setInsets(0, 0, 0, 0))); 

     /* 
     * Adds Character Current Level ComboBox 
     */ 
     pickLvlAns.setPrototypeDisplayValue(pickLvlAns.getItemAt(lvlRange.length - 1)); 
     selPane.add(pickLvlAns, setGbc(1,1, 0, 0, "WEST", 1, 1, setInsets(0, 10, 0, 0))); 
     pickLvlAns.addActionListener(
       new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         String currLvl = ((JComboBox)(e.getSource())).getSelectedItem().toString(); 
         if(isInteger(currLvl)){ 
          if (Integer.parseInt(currLvl) == maxLvl){ 
           nextLvlAns.setText(unselectedLvl); 
          } else { 
           nextLvlAns.setText(Integer.toString(Integer.parseInt(currLvl) + 1)); 
          } 
         } else { 
          nextLvlAns.setText(unselectedLvl); 
         } 
        } 
       } 
     ); 

     /* 
     * Adds "Next Level:" Label 
     */ 
     selPane.add(nextLvl, setGbc(0,2, 0, 0, "EAST", 0, 1, setInsets(0, 0, 0, 0))); 

     /* 
     * Adds Character Next Level Label 
     */ 
     nextLvlAns.setBorder(blackLine); 
     nextLvlAns.setHorizontalAlignment(JLabel.CENTER); 
     selPane.add(nextLvlAns, setGbc(1,2, 28, 5, "WEST", 1, 1, setInsets(0, 10, 0, 0))); 

     //******************************************************************************* 

     topFrame.add(selPane); 

     //******************************************************************************* 

     /* 
     * BOTTOM PANE 
     */ 
     TitledBorder bottomFrameTitle; 
     bottomFrameTitle = BorderFactory.createTitledBorder(compound, "Stats"); 
     bottomFrameTitle.setTitleJustification(TitledBorder.CENTER); 
     bottomFrame.setBorder(bottomFrameTitle); 

     //******************************************************************************* 

     /* 
     * Display everything in GUI to user 
     */ 
     add(topFrame, BorderLayout.NORTH); 
     add(bottomFrame,BorderLayout.CENTER); 

     setSize(800,600); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void actionPerformed(ActionEvent arg0) { 

    } 

    private GridBagConstraints setGbc(int gridx, int gridy, int ipadx, int ipady, String anchorLocation, double weightx, double weighty, Insets insets){ 
     GridBagConstraints gbc = new GridBagConstraints(); 

     if (anchorLocation.toUpperCase().equals("NORTHWEST")){ 
      gbc.anchor = GridBagConstraints.NORTHWEST; 
     } else if (anchorLocation.toUpperCase().equals("NORTH")){ 
      gbc.anchor = GridBagConstraints.NORTH; 
     } else if (anchorLocation.toUpperCase().equals("NORTHEAST")){ 
      gbc.anchor = GridBagConstraints.NORTHEAST; 
     } else if (anchorLocation.toUpperCase().equals("WEST")){ 
      gbc.anchor = GridBagConstraints.WEST; 
     } else if (anchorLocation.toUpperCase().equals("EAST")){ 
      gbc.anchor = GridBagConstraints.EAST; 
     } else if (anchorLocation.toUpperCase().equals("SOUTHWEST")){ 
      gbc.anchor = GridBagConstraints.SOUTHWEST; 
     } else if (anchorLocation.toUpperCase().equals("SOUTH")){ 
      gbc.anchor = GridBagConstraints.SOUTH; 
     } else if (anchorLocation.toUpperCase().equals("SOUTHEAST")){ 
      gbc.anchor = GridBagConstraints.SOUTHEAST; 
     } else { 
      gbc.anchor = GridBagConstraints.CENTER; 
     } 

     gbc.gridx = gridx; 
     gbc.gridy = gridy; 
     gbc.ipadx = ipadx; 
     gbc.ipady = ipady; 
     gbc.weightx = weightx; 
     gbc.weighty = weighty; 
     gbc.insets = insets; 

     return gbc; 
    } 

    private Insets setInsets(int top, int left, int bottom, int right){ 
     Insets insets = new Insets(top,left,bottom,right); 
     return insets; 
    } 

    protected static String[] createArrRange(String firstElement, int startNum, int endNum) { 
     String[] strArr = new String[endNum+1]; 
     strArr[0] = firstElement; 
     for (int num = startNum, element = 1; num <= endNum; num++, element++){ 
      strArr[element] = Integer.toString(num); 
     } 
     return strArr; 
    } 

    public static boolean isInteger(String s) { 
     try { 
      Integer.parseInt(s); 
     } catch(NumberFormatException e) { 
      return false; 
     } catch(NullPointerException e) { 
      return false; 
     } 
     // only got here if we didn't return false 
     return true; 
    } 

    public static void main(String[] args) { 
     new StartGuiTest(); 
    } 
} 

我試過使用label.setPrototypeDisplayValue(),但我想這隻適用於鎖定它們的組合框,所以它們不會改變大小。我似乎無法找到圖書館或谷歌任何顯示如何做到這一點。

+0

你能解釋一下我不是那麼做嗎?我的問題難以理解嗎? –

+0

我明白了,給我一點時間,我會鼓起一些東西(如果我複製並粘貼它,由於多個其他文件的多態性,有些東西不會編譯)。 –

+1

好的,我編輯了複製/粘貼編譯的代碼。 –

回答

3

歡迎來到可變寬度字體的美妙世界。

我會summiuse,這個問題是不是與nextLvlAns,但與pickLvlAns

這個問題似乎是--是一個不同的大小,然後2,它正在改變組合框的大小。

你在正確的方向與使用setPrototypeDisplayValue開始,但我建議使用例如東西長pickLvlAns.setPrototypeDisplayValue("00");甚至可能pickLvlAns.setPrototypeDisplayValue("----");,使其覆蓋更大的可能範圍。

記住,使用可變寬度字體時,0很可能是更大的-

另一個技巧可能是使用一個不可編輯JTextField代替JLabel的,這是因爲,JLabel一直想自己適應於文字內容

JTextField nextLvlAns = new JTextField(unselectedLvl, 3); 
//... 
nextLvlAns.setEditable(false); 
+0

嗯,組合框的大小不會改變。當價值發生變化時,標籤會發生變化。標籤的值取決於組合框'ActionListener()'的改變。一旦標籤值發生變化,寄存器單元就會調整大小,這就是問題所在。我確實發現你可以使用3行似乎工作'nextLvlAns.setMinimumSize(new Dimension(42,23));''nextLvlAns.setMaximumSize(new Dimension(42,23));''nextLvlAns.setPreferredSize(new Dimension( 42,23));',然後將ipads設置爲0. +1,但替代解決方案。似乎有點乾淨。 –

+0

因爲它可能會對使用不同字體/字體的系統產生不利影響,所以使用'preferred/minimum/maximumSize'是很危險的。 – MadProgrammer

+0

這很好理解。我會記住這一點。謝謝 :) –