Последняя кнопка распространяется на весь графический интерфейс в Java - PullRequest
0 голосов
/ 30 мая 2018

Я создал класс Java, который содержит крошечный калькулятор для выполнения функций сложения и умножения, имеющий 3 текстовых поля для ввода и некоторые надписи с кнопками.Проблема в том, что, когда я поместил все элементы в их координаты x, y и установил их ширину и высоту, последняя кнопка распространяется на весь экран на фоне окна GUI.Вот код, пожалуйста, сообщите мне проблему.спасибо

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

public class SmallCalcApp implements ActionListener{

    JFrame frame;
    JLabel firstOperand, secondOperand, answer; 
    JTextField op1, op2, ans;
    JButton plus, mul;

    public SmallCalcApp(){
        initGUI();
    }

    public void initGUI(){

        frame = new JFrame();
        Container con = frame.getContentPane();


        //initialization of objects
        plus = new JButton("+");
        mul = new JButton("*");
        op1 = new JTextField();
        op2 = new JTextField();
        ans = new JTextField();
        firstOperand = new JLabel("First Number: ");
        secondOperand = new JLabel("Second Number: ");
        answer = new JLabel("Calculated Result: ");


        firstOperand.setBounds(0, 0, 150, 20);
        op1.setBounds(200, 0, 150, 20);
        secondOperand.setBounds(0, 200, 150, 20);
        op2.setBounds(200, 200, 150, 20);
        answer.setBounds(0, 300, 150, 20);
        ans.setBounds(300, 300, 150, 20);
        plus.setBounds(0, 400, 50, 50);
        mul.setBounds(200, 400, 50, 50);




        con.add(firstOperand);
        con.add(op1);
        con.add(secondOperand); 
        con.add(op2);   
        con.add(answer);    
        con.add(ans);
        con.add(plus);
        con.add(mul);



        plus.addActionListener(this);
        mul.addActionListener(this);



        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200,200);
        frame.setVisible(true);
    }

    public void actionPerformed(ActionEvent event){
            String oper, result;
            int num1, num2, res;



            if(event.getSource() == plus){
                oper = op1.getText();
                num1 = Integer.parseInt(oper);

                oper = op2.getText();
                num2 = Integer.parseInt(oper);

                res = num1 + num2;
                result = res + "";

                ans.setText(result);
            }

            if(event.getSource() == mul){
                oper = op1.getText();
                num1 = Integer.parseInt(oper);

                oper = op2.getText();
                num2 = Integer.parseInt(oper);

                res = num1 * num2;
                result = res + "";

                ans.setText(result);
            }
        } 


    public static void main(String[] args){
        SmallCalcApp sc = new SmallCalcApp();
    }
}

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вообще говоря, вам следует избегать абсолютного позиционирования.Если вам do необходимо явно указать координаты пикселей для объектов, предпочтите менеджер макетов, например GridBagLayout, который, по крайней мере, дает вам прямой контроль над размером сетки и интервалом.

Для ваших целей, я думаю, что имеет смысл построить сетку 9x9 по 50 пикселей каждый, а затем указать каждый из ваших объектов, чтобы они заняли несколько из этих блоков каждый.

Итак, в вашем initGUI метод, мы сначала установим макет:

GridBagLayout layout;
public void initGUI() {
    /*...*/
    con.setLayout(layout = new GridBagLayout());
    layout.columnWidths = new int[9];
    Arrays.fill(layout.columnWidths, 50);
    layout.rowHeights = new int[9];
    Arrays.fill(layout.rowHeights, 50);

Затем, после этого, мы определим ограничения для каждого из объектов, отображаемых в вашем приложении.Это немного многословно, но во многом это стандартный код.

//Label will be 150 (50*3) pixels wide, start at 0,0, and we'll add 30 pixels of padding below it.
GridBagConstraints firstOperandConstraints = new GridBagConstraints(
        0,0,
        3,1,
        1,1,
        GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
        new Insets(0, 0, 30, 0),
        0, 0
        );
//Text field will be 150 (50*3) pixels wide, start at 200(50*4),0, and have 30 pixels of padding below it
GridBagConstraints op1Constraints = new GridBagConstraints(
        4,0,
        3,1,
        1,1,
        GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
        new Insets(0, 0, 30, 0),
        0, 0
        );
//Label will be 150 (50*3) pixels wide, start at 0,200 (50*4), and we'll add 30 pixels of padding below it.
GridBagConstraints secondOperandConstraints = new GridBagConstraints(
        0,4,
        3,1,
        1,1,
        GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
        new Insets(0, 0, 30, 0),
        0, 0
        );
//Field will be 150 (50*3) pixels wide, start at 200,200 (50*4), and we'll add 30 pixels of padding below it.
GridBagConstraints op2Constraints = new GridBagConstraints(
        4,4,
        3,1,
        1,1,
        GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
        new Insets(0, 0, 30, 0),
        0, 0
        );
//Label will be 150 (50*3) pixels wide, start at 0,300 (50*6), and we'll add 30 pixels of padding below it.
GridBagConstraints answerConstraints = new GridBagConstraints(
        0,6,
        3,1,
        1,1,
        GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
        new Insets(0, 0, 30, 0),
        0, 0
        );
//Label will be 150 (50*3) pixels wide, start at 300,300 (50*6), and we'll add 30 pixels of padding below it.
GridBagConstraints ansConstraints = new GridBagConstraints(
        6,6,
        3,1,
        1,1,
        GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
        new Insets(0, 0, 30, 0),
        0, 0
        );
//Button will be 50 pixels wide/tall, start at 0,400 (50*8), and it won't have any padding
GridBagConstraints plusConstraints = new GridBagConstraints(
        0,8,
        1,1,
        1,1,
        GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
        new Insets(0, 0, 0, 0),
        0, 0
        );
//Button will be 50 pixels wide/tall, start at 200,400 (50*4/50*8), and it won't have any padding
GridBagConstraints mulConstraints = new GridBagConstraints(
        4,8,
        1,1,
        1,1,
        GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
        new Insets(0, 0, 0, 0),
        0, 0
        );

Затем мы добавим каждое из этих ограничений при добавлении кнопок / меток / полей:

con.add(firstOperand, firstOperandConstraints);
con.add(op1, op1Constraints);
con.add(secondOperand, secondOperandConstraints); 
con.add(op2, op2Constraints);   
con.add(answer, answerConstraints);    
con.add(ans, ansConstraints);
con.add(plus, plusConstraints);
con.add(mul, mulConstraints);

И, наконец, мы сделаем фрейм неизменяемым, чтобы гарантировать, что все не движется:

frame.pack();
frame.setResizable(false);

В результате получается приложение, которое выглядит следующим образом:

App

С добавлением линий сетки (вручную, поэтому они немного неровные), мы можем увидеть, как он разделил экран:

App with Grid Lines

В зависимости от ваших требований, вам может понадобиться «украсить» это приложение, перемещая компоненты или изменяя размеры.Несколько вещей для рассмотрения:

  • Вы можете получить любое произвольное позиционирование, которое вам нужно, комбинируя положения сетки и вставки.Ящик, занимающий [230,170]-[290,320], может быть легко представлен, если начать объект с позиции 4,3, присвоив ему значения ширины / высоты 2,4 и указав Вставки (20, 30, 30, 10).
  • Если вы хотитеЧтобы изменить размер рамки без изменения положения / размеров компонентов, вам необходимо объединить их в их собственную панель и добавить эту панель в корневую панель содержимого.

Ниже приведен пример, который позволяетразмер самой рамки должен быть изменен без перемещения кнопок / полей / надписей или слишком маленького размера для отображения этих компонентов:

JPanel panel = new JPanel();

panel.setLayout(layout = new GridBagLayout());
layout.columnWidths = new int[9];
Arrays.fill(layout.columnWidths, 50);
layout.rowHeights = new int[9];
Arrays.fill(layout.rowHeights, 50);

panel.add(firstOperand, firstOperandConstraints);
panel.add(op1, op1Constraints);
panel.add(secondOperand, secondOperandConstraints); 
panel.add(op2, op2Constraints);   
panel.add(answer, answerConstraints);    
panel.add(ans, ansConstraints);
panel.add(plus, plusConstraints);
panel.add(mul, mulConstraints);

GridBagLayout rootLayout = new GridBagLayout();
rootLayout.columnWidths = new int[]{450};
rootLayout.rowHeights = new int[]{450};
con.setLayout(rootLayout);
con.add(panel, new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0,0,0,0),0,0));

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setMinimumSize(null); //To make sure the pack() directive doesn't result in a frame larger than the components
frame.pack();
frame.setMinimumSize(frame.getSize());
frame.setVisible(true);
0 голосов
/ 30 мая 2018

Для любого приложения свинга макет является обязательным.Таким образом, вы должны установить «setLayout» для любого контейнера.Установите макет «ноль» или любой макет, который вы хотите.если вы не установите макет, каждый компонент будет занимать весь контейнер.Для расчета типа приложения подходит "GridLayout".Для быстрого решения вы можете использовать следующую строку.

    Container con = frame.getContentPane();
    con.setLayout(null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...