2017-04-14 6 views
0

私はJava Swingを初めて使い慣れており、もっと慣れ親しむプロジェクトに取り組んでいます。私はラベルのテキストを変更している間に気づきました。GridBagLayouのセルは増減します(境界線のサイズ変更によってわかります)。私は、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()を使用してみましたが、私は彼らがサイズを変更しないように、それらをロックでコンボボックスのこの唯一の作品を推測します。私はこれを行う方法を示すライブラリやGoogleで何かを見つけることができないようです。

+0

どうすればいいのか説明できますか?私の質問は分かりにくいですか? –

+0

私には分かりますが、私は何かを叩いてしまいます(コピーして貼り付けると、他のいくつかのファイルの多形性のためにコンパイルできないものもあります)。 –

+1

さて、私はコンパイルをコピー/ペーストするコードを編集しました。 –

答えて

3

可変幅フォントの素晴らしい世界へようこそ。

は、私は問題がnextLvlAnsではないことをsummiuseだろうが、pickLvlAns

で問題が--は、コンボボックスのサイズを変更している異なるサイズ、その後2、あると思われます。

あなたが使用して setPrototypeDisplayValueで右方向に始めたが、私はそれがより大きな可能な範囲を覆うように、例えば何かの長い pickLvlAns.setPrototypeDisplayValue("00");あるいは多分 pickLvlAns.setPrototypeDisplayValue("----");を使用してお勧めしたいです。

は覚えておいて、可変幅フォントを使用する場合、0は別のトリックはJLabelがに自分自身を適応したい続けるこの、ので、代わりにJLabelの編集不可JTextFieldを使用するのが良いかもしれない-

大きくなる可能性がありますテキストコンテンツ

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

Hmmm、コンボボックスのサイズは変わりません。値が変更されたときに変化するラベルです。コンボボックス 'ActionListener()'に応じて、ラベルの値が変更されます。ラベル値が変更されると、ボーダーセルのサイズが変更され、これが問題になりました。私はあなたが 'nextLvlAns.setMinimumSize(new Dimension(42、23));' 'nextLvlAns.setMaximumSize(new Dimension(42、23));' 'nextLvlAns.setPreferredSize(新しい次元42,23)); '、そしてipadsを0に設定してください。ちょっときれいに見えます。 –

+0

'preferred/minimum/maximumSize'がうまくいかないのは、異なるフォント/フォントmetrcisを使用するシステムに悪影響を及ぼしかねないので危険です。 – MadProgrammer

+0

これは知っておきたいことです。ちゃんと覚えておきますよ。ありがとう:) –