2016-08-30 5 views
0

私はJavaプログラミングを初めて使います。最初のアプリケーション(単純な電卓です)のレイアウトを教えてください。 は、ここで私が書いたコードです:GridLayoutでJComponentsのサイズを変更するにはどうすればよいですか?

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

class InputPad extends JFrame { 

    private JLabel statusLabel; 
    private JTextArea expTextArea; 

    InputPad() { 
     prepareGUI(); 
    } 

    private void prepareGUI(){ 
     JFrame mainFrame = new JFrame("My Calculator"); 
     mainFrame.setSize(450,450); 
     mainFrame.setLayout(new GridLayout(3,2)); 
     mainFrame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent windowEvent){ 
       System.exit(0); 
      } 
     }); 

     JLabel headerLabel = new JLabel("Put your expression here:", JLabel.CENTER); 
     statusLabel = new JLabel("",JLabel.CENTER); 
     expTextArea = new JTextArea("1+(2^3*4)"); 

     //Digits Panel 
     JPanel digitPanel = new JPanel(); 
     GroupLayout layoutDigits = new GroupLayout(digitPanel); 
     digitPanel.setLayout(layoutDigits); 
     layoutDigits.setAutoCreateGaps(true); 
     layoutDigits.setAutoCreateContainerGaps(true); 

     //Operators Panel 
     JPanel operatorPanel = new JPanel(); 
     GroupLayout layoutOperators = new GroupLayout(operatorPanel); 
     operatorPanel.setLayout(layoutOperators); 
     layoutOperators.setAutoCreateGaps(true); 
     layoutOperators.setAutoCreateContainerGaps(true); 


     JButton[] numButtons= new JButton[10]; 

     int i; 
     for (i=0;i<10;i++){ 
      numButtons[i] = new JButton(Integer.toString(i)); 
      numButtons[i].addActionListener(e -> { 
//   TODO 
      }); 
     } 

     JButton bEquals = new JButton("="); 
     bEquals.addActionListener(e -> { 
//   TODO 
     }); 

     JButton bPlus = new JButton("+"); 
     bPlus.addActionListener(e -> { 
//   TODO 
     }); 
     JButton bMinus = new JButton("-"); 
     bMinus.addActionListener(e -> { 
//   TODO 
     }); 
     JButton bMultiply = new JButton("*"); 
     bMultiply.addActionListener(e -> { 
//   TODO 
     }); 
     JButton bDivide = new JButton("/"); 
     bDivide.addActionListener(e -> { 
//   TODO 
     }); 
     JButton bLeftParenthesis = new JButton("("); 
     bLeftParenthesis.addActionListener(e -> { 
//   TODO 
     }); 
     JButton bRightParenthesis = new JButton(")"); 
     bRightParenthesis.addActionListener(e -> { 
//   TODO 
     }); 
     JButton bPower = new JButton("^"); 
     bPower.addActionListener(e -> { 
//   TODO 
     }); 
     JButton bDel = new JButton("←"); 
     bDel.addActionListener(e -> { 
//   TODO 
     }); 


     layoutDigits.setHorizontalGroup(
       layoutDigits.createSequentialGroup() 
         .addGroup(layoutDigits.createParallelGroup(GroupLayout.Alignment.LEADING) 
           .addComponent(numButtons[7]) 
           .addComponent(numButtons[4]) 
           .addComponent(numButtons[1]) 
           .addComponent(numButtons[0])) 
         .addGroup(layoutDigits.createParallelGroup(GroupLayout.Alignment.LEADING) 
           .addComponent(numButtons[8]) 
           .addComponent(numButtons[5]) 
           .addComponent(numButtons[2]) 
           .addComponent(bEquals)) 
         .addGroup(layoutDigits.createParallelGroup(GroupLayout.Alignment.LEADING) 
           .addComponent(numButtons[9]) 
           .addComponent(numButtons[6]) 
           .addComponent(numButtons[3])) 
     ); 
     layoutDigits.setVerticalGroup(
       layoutDigits.createSequentialGroup() 
         .addGroup(layoutDigits.createParallelGroup(GroupLayout.Alignment.BASELINE) 
           .addComponent(numButtons[7]) 
           .addComponent(numButtons[8]) 
           .addComponent(numButtons[9])) 
         .addGroup(layoutDigits.createParallelGroup(GroupLayout.Alignment.BASELINE) 
           .addComponent(numButtons[4]) 
           .addComponent(numButtons[5]) 
           .addComponent(numButtons[6])) 
         .addGroup(layoutDigits.createParallelGroup(GroupLayout.Alignment.BASELINE) 
           .addComponent(numButtons[1]) 
           .addComponent(numButtons[2]) 
           .addComponent(numButtons[3])) 
         .addGroup(layoutDigits.createParallelGroup(GroupLayout.Alignment.BASELINE) 
           .addComponent(numButtons[0]) 
           .addComponent(bEquals)) 
     ); 

     layoutOperators.setHorizontalGroup(
       layoutOperators.createSequentialGroup() 
         .addGroup(layoutOperators.createParallelGroup(GroupLayout.Alignment.LEADING) 
           .addComponent(bPlus) 
           .addComponent(bMinus) 
           .addComponent(bLeftParenthesis) 
           .addComponent(bPower)) 
         .addGroup(layoutOperators.createParallelGroup(GroupLayout.Alignment.LEADING) 
           .addComponent(bMultiply) 
           .addComponent(bDivide) 
           .addComponent(bRightParenthesis) 
           .addComponent(bDel)) 
     ); 
     layoutOperators.setVerticalGroup(
       layoutOperators.createSequentialGroup() 
         .addGroup(layoutOperators.createParallelGroup(GroupLayout.Alignment.BASELINE) 
           .addComponent(bPlus) 
           .addComponent(bMultiply)) 
         .addGroup(layoutOperators.createParallelGroup(GroupLayout.Alignment.BASELINE) 
           .addComponent(bMinus) 
           .addComponent(bDivide)) 
         .addGroup(layoutOperators.createParallelGroup(GroupLayout.Alignment.BASELINE) 
           .addComponent(bLeftParenthesis) 
           .addComponent(bRightParenthesis)) 
         .addGroup(layoutOperators.createParallelGroup(GroupLayout.Alignment.BASELINE) 
           .addComponent(bPower) 
           .addComponent(bDel)) 
     ); 


     mainFrame.add(headerLabel); 
     mainFrame.add(expTextArea); 
     mainFrame.add(digitPanel); 
     mainFrame.add(operatorPanel); 
     mainFrame.add(statusLabel); 
     mainFrame.setVisible(true); 
    } 

} 

私は私のJFrameのためのGridLayoutを試してみましたが、私は、メインのJFrameを除いてサイズを変更し、私のJComponentのことができませんでした。 GridLayoutの1つのセルに2つのJPanel(横並び)を配置したり、GridLayoutの2つのセルにJLabelを展開することはできません。

これは私が得たものである:

what I got

そして、ここでは、私が欲しいものです: what I want

+0

あなたはそうではありません、それはそのレイアウトの仕組みではありません –

+0

1+ほぼ正しい[mcve] – Frakcool

答えて

2

GridLayout

GridLayoutには、単に同じサイズの部品の束を作り、行と列

の要求数に表示の一部のリンクから、 Layout Managersの使用から始めるのをしてみましょう

だから、これはあなたが望むものではありませんが、GridBagLayout部分を読めば、それは言う:

GridBagLa youtは、洗練された柔軟なレイアウトマネージャです。コンポーネントをセルのグリッド内に配置することによってコンポーネントを整列させ、コンポーネントを複数のセルにまたがるようにします。グリッド内の行は異なる高さを持つことができ、グリッド列は異なる幅を持つことができます。

我々はBoxLayoutとともに、それらの両方を組み合わせることができ、あなたはあなたが達成しようとしているものに類似した出力が得られます:

enter image description here


ご注意:

コードを投稿する前に、次のヒントをメモしておいてください。

  1. あなたはJFrameを拡張していますが、同時にJFrameオブジェクトを作成していますが、これは推奨されていません。その場合はオブジェクトを使用しているので、あなたのクラスからextends JFrameを削除するだけです。実際に何かを拡張する必要がある場合は、JFrameではなく、JPanelを拡張してください。

  2. EDT内部に置き、あなたのプログラムを、私はmain()方法

  3. で行ったように上記のコード


そして今のようにsetDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)を呼び出す代わりにSystem.exit(0);を使用しないでくださいコード

import java.awt.BorderLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Insets; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 

public class CalculatorExample { 
    private JFrame frame; 
    private JTextArea area; 
    private JButton[][] digitsButtons, symbolsButtons; 
    private String[][] digitsText = {{"7", "8", "9"}, {"4", "5", "6"}, {"1", "2", "3"}, {"0", "="}}; //Looks strange but this will make the button adding easier 
    private String[][] symbolsText = {{"+", "*"}, {"-", "/"}, {"(", ")"}, {"^", "←"}}; 
    private JPanel buttonsPane, areaAndResultsPane, digitsPane, symbolsPane; 
    private JLabel label; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new CalculatorExample().createAndShowGui(); 
      } 
     }); 
    } 

    public void createAndShowGui() { 
     frame = new JFrame("Calculator Example"); 
     area = new JTextArea(); 
     area.setRows(5); 
     area.setColumns(20); 
     label = new JLabel("Results go here"); 
     digitsButtons = new JButton [4][3]; 
     symbolsButtons= new JButton [4][2]; 
     areaAndResultsPane = new JPanel(); 
     areaAndResultsPane.setLayout(new BoxLayout(areaAndResultsPane, BoxLayout.PAGE_AXIS)); 

     buttonsPane = new JPanel(); 
     buttonsPane.setLayout(new GridLayout(1, 2, 10, 10)); 

     digitsPane = new JPanel(); 
     digitsPane.setLayout(new GridBagLayout()); 

     symbolsPane = new JPanel(); 
     symbolsPane.setLayout(new GridLayout(4, 2)); 

     GridBagConstraints c = new GridBagConstraints(); 

     for (int i = 0; i < digitsText.length; i++) { 
      for (int j = 0; j < digitsText[i].length; j++) { 
       digitsButtons[i][j] = new JButton(digitsText[i][j]); 
      } 
     } 

     for (int i = 0; i < symbolsText.length; i++) { 
      for (int j = 0; j < symbolsText[i].length; j++) { 
       symbolsButtons[i][j] = new JButton(symbolsText[i][j]); 
      } 
     } 

     areaAndResultsPane.add(area); 
     areaAndResultsPane.add(label); 

     boolean shouldBreak = false; 
     for (int i = 0; i < digitsButtons.length; i++) { 
      for (int j = 0; j < digitsButtons[i].length; j++) { 
       c.gridx = j; 
       c.gridy = i; 
       c.fill = GridBagConstraints.HORIZONTAL; 
       c.weightx = 0.5; 
       if (i == 3) { 
        if (j == 1) { 
         c.gridwidth = 2; //This makes the "=" button larger 
         shouldBreak = true; 
        } 
       } 
       digitsPane.add(digitsButtons[i][j], c); 
       if (shouldBreak) { 
        break; 
       } 
      } 
     } 

     for (int i = 0; i < symbolsButtons.length; i++) { 
      for (int j = 0; j < symbolsButtons[i].length; j++) { 
       symbolsPane.add(symbolsButtons[i][j]); 
      } 
     } 

     frame.add(areaAndResultsPane, BorderLayout.NORTH); 
     buttonsPane.add(digitsPane); 
     buttonsPane.add(symbolsPane); 

     frame.add(buttonsPane, BorderLayout.CENTER); 

     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

これはネストされたJPanelsであり、レイアウトがそれぞれ異なりますので、ここから続行することをお勧めします。

0

Oracleのドキュメントによると:

各コンポーネントは、すべての利用可能なスペースを取りますそのセル内にあり、各セルはまったく同じサイズです。

悲しいことに、は、GridLayout内のコンポーネントのサイズを変更できません。

代わりにGridBagLayoutを使用できます。理解するのが少し複雑ですが、より多くの機能を提供します。私はあなたがそれに触れるためにドキュメントを使っていくつかのテストをしましょう!

関連する問題