JPanel не адаптируется к любым изменениям - PullRequest
0 голосов
/ 11 октября 2018

Сначала я вызвал свою панель внутри JFrame.Все работало просто отлично.

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

JFrame никак не реагирует на изменения, которые я установил для панели.Ни при изменении размера, например, внутри класса Panel, ни при изменении размера в классе JFrame.

Панель всегда расширяется по размеру JFrame, как Flowlayout.Но попытка изменить компоновку также не сработала и не должна иметь никакого значения, так как Panel работала раньше (при кодировании внутри JFrame, а не в отдельном классе).

Как исправить код вчтобы я мог настроить панель и заставить JFrame распознавать эти изменения?В настоящее время я использую Eclipse и NetBeans;не работает ни в одном из них.

Main:

package calculatorXtreme;

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JMenu;

public class Main {

    public static void main(String[] args) {
        Interface interface1 =new Interface();
        interface1.show();
    }

}

Панель:

package calculatorXtreme;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class PannelDez extends JPanel {
    JLabel text = new JLabel();
    JButton delete = new JButton();
    JButton zero = new JButton();
    JButton eins = new JButton();
    JButton zwei = new JButton();
    JButton drei = new JButton();
    JButton vier = new JButton();
    JButton fuenf = new JButton();
    JButton sechs = new JButton();
    JButton sieben = new JButton();
    JButton acht = new JButton();
    JButton neun = new JButton();
    JButton addieren = new JButton();
    JButton subtrahieren = new JButton();
    JButton multiplizieren = new JButton();
    JButton dividieren = new JButton();
    JButton ergebnis = new JButton();
    JTextField anzeige = new JTextField();
    String erg = "";
    int temp1;
    RechnerInt interfaceRechner = new RechnerInt();

    public PannelDez() {

        //Panel

        this.setSize(400, 500);
        anzeige.setBounds(125,100, 200, 50);
        anzeige.setSize(200, 50);
        anzeige.setEditable(false);
        anzeige.setText(erg);
        this.add(anzeige);


        //Buttons 

        delete.setText("C");
        zero.setText("0");
        eins.setText("1");
        zwei.setText("2");
        drei.setText("3");
        vier.setText("4");
        fuenf.setText("5");
        sechs.setText("6");
        sieben.setText("7");
        acht.setText("8");
        neun.setText("9");
        addieren.setText("+");
        subtrahieren.setText("-");
        multiplizieren.setText("*");
        dividieren.setText("/");
        ergebnis.setText("=");



        this.add(delete);
        this.add(zero);
        this.add(eins);
        this.add(zwei);
        this.add(drei);
        this.add(vier);
        this.add(fuenf);
        this.add(sechs);
        this.add(sieben);
        this.add(acht);
        this.add(neun);
        this.add(addieren);
        this.add(subtrahieren);
        this.add(multiplizieren);
        this.add(dividieren);
        this.add(ergebnis);

        delete.addActionListener(new ListenDelete());
        zero.addActionListener(new ListenZero());
        eins.addActionListener(new ListenEins());
        zwei.addActionListener(new ListenZwei());
        drei.addActionListener(new ListenDrei());
        vier.addActionListener(new ListenVier());
        fuenf.addActionListener(new ListenFuenf());
        sechs.addActionListener(new ListenSechs());
        sieben.addActionListener(new ListenSieben());
        acht.addActionListener(new ListenAcht());
        neun.addActionListener(new ListenNeun());
        addieren.addActionListener(new ListenAddieren());
        subtrahieren.addActionListener(new ListenSubtrahieren());
        multiplizieren.addActionListener(new ListenMultiplizieren());
        dividieren.addActionListener(new ListenDividieren());
        ergebnis.addActionListener(new ListenErgebnis());

        /* JPanel panel2 = new JPanel();
        panel2.setLayout(new FlowLayout());  */

    }

    public void resizeButtons()
    {
        delete.setBounds(225, 350, 50, 50);
        zero.setBounds(175, 350,50,50);
        eins.setBounds(125, 300,50,50);
        zwei.setBounds(175, 300,50,50);
        drei.setBounds(225, 300,50,50);
        vier.setBounds(125, 250,50,50);
        fuenf.setBounds(175, 250,50,50);
        sechs.setBounds(225, 250,50,50);
        sieben.setBounds(125, 200,50,50);
        acht.setBounds(175, 200,50,50);
        neun.setBounds(225, 200,50,50);
        addieren.setBounds(275, 300,50,50);
        subtrahieren.setBounds(275, 250,50,50);
        multiplizieren.setBounds(275, 200,50,50);
        dividieren.setBounds(275, 150,50,50);
        ergebnis.setBounds(275, 350,50,50);
    }

    class ListenDelete implements ActionListener {
        public void actionPerformed (ActionEvent e) {
            interfaceRechner.operators.clear();
            interfaceRechner.numbers.clear();
            interfaceRechner.numbersInt.clear();
            anzeige.setText("");
        }
    }
    class ListenZero implements ActionListener {
        public void actionPerformed (ActionEvent e) {
            erg = anzeige.getText();
            anzeige.setText(erg + "0");
            erg = anzeige.getText();
        }
    }
    class ListenEins implements ActionListener {
        public void actionPerformed (ActionEvent e) {
            erg = anzeige.getText();
            anzeige.setText(erg + "1");
            erg = anzeige.getText();
            return;
        }
    }
    class ListenZwei implements ActionListener {
        public void actionPerformed (ActionEvent e) {
            erg = anzeige.getText();
            anzeige.setText(erg + "2");
            erg = anzeige.getText();
        }
    }
    class ListenDrei implements ActionListener {
        public void actionPerformed (ActionEvent e) {
            erg = anzeige.getText();
            anzeige.setText(erg + "3");
            erg = anzeige.getText();
        }
    }
    class ListenVier implements ActionListener {
        public void actionPerformed (ActionEvent e) {
            erg = anzeige.getText();
            anzeige.setText(erg + "4");
            erg = anzeige.getText();
        }
    }
    class ListenFuenf implements ActionListener {
        public void actionPerformed (ActionEvent e) {
            erg = anzeige.getText();
            anzeige.setText(erg + "5");
            erg = anzeige.getText();
        }
    }
    class ListenSechs implements ActionListener {
        public void actionPerformed (ActionEvent e) {
            erg = anzeige.getText();
            anzeige.setText(erg + "6");
            erg = anzeige.getText();
        }
    }
    class ListenSieben implements ActionListener {
        public void actionPerformed (ActionEvent e) {
            erg = anzeige.getText();
            anzeige.setText(erg + "7");
            erg = anzeige.getText();
        }
    }
    class ListenAcht implements ActionListener {
        public void actionPerformed (ActionEvent e) {
            erg = anzeige.getText();
            anzeige.setText(erg + "8");
            erg = anzeige.getText();
        }
    }
    class ListenNeun implements ActionListener {
    public void actionPerformed (ActionEvent e) {
            erg = anzeige.getText();
            anzeige.setText(erg + "9");
            erg = anzeige.getText();
        }
    }
    class ListenAddieren implements ActionListener {
    public void actionPerformed (ActionEvent e) {
            erg = anzeige.getText();
            interfaceRechner.addNumber(Integer.valueOf(erg));
            interfaceRechner.addOperators("+");
            anzeige.setText("");
            erg = null;
        }
    }
    class ListenSubtrahieren implements ActionListener {

        public void actionPerformed (ActionEvent e) {
                erg = anzeige.getText();
                interfaceRechner.addNumber(Integer.valueOf(erg));
                interfaceRechner.addOperators("-");
                anzeige.setText("");
                erg = null;
            }
        }
    class ListenMultiplizieren implements ActionListener {
        public void actionPerformed (ActionEvent e) {
                erg = anzeige.getText();
                interfaceRechner.addNumber(Integer.valueOf(erg));
                interfaceRechner.addOperators("*");
                anzeige.setText("");
                erg = null;
            }
        }
    class ListenDividieren implements ActionListener {
        public void actionPerformed (ActionEvent e) {
                erg = anzeige.getText();
                interfaceRechner.addNumber(Integer.valueOf(erg));
                interfaceRechner.addOperators("/");
                anzeige.setText("");
                erg = null;
            }
        }
    class ListenErgebnis implements ActionListener {
        public void actionPerformed (ActionEvent e) {
                erg = anzeige.getText();
                interfaceRechner.addNumber(Integer.valueOf(erg));
                interfaceRechner.addOperators("=");
                anzeige.setText(""+interfaceRechner.berechneInt());

            }
        }

}

JFrame:

package calculatorXtreme;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.plaf.ColorUIResource;
import javax.swing.JButton;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Dimension;


public class Interface extends JFrame  {

public Interface(){

// PanelAdden

PannelDez panel2 = new PannelDez();
//panel2.setSize(400, 500);
this.setSize(700, 800);
panel2.setSize(300, 200);
this.setVisible(true);
this.setResizable(false);
panel2.setSize(400, 500);
panel2.setBounds(0, 0, 400, 500);
panel2.resizeButtons();
this.add(panel2);

// Menüleiste

JMenuBar jmb = new JMenuBar();
this.setJMenuBar(jmb);
JMenu file = new JMenu("Option");
jmb.add(file);
JMenuItem dez = new JMenuItem("Dezimal-Rechner");
file.add(dez);
JMenuItem hex = new JMenuItem("Hex-Rechner");
file.add(hex);
this.setVisible(true);


    }

}

RechnerInt:

package calculatorXtreme;

import java.util.ArrayList;
import java.util.List;

public class RechnerInt {
    List<String> numbers = new ArrayList<>();
    List<String> operators = new ArrayList<>();
    List<Double> numbersDouble = new ArrayList<>();
    List<Integer> numbersInt = new ArrayList<>();
    double zahl1, zahl2, ergebnis;
    String op;
    boolean abbruch = true;

    public double rechnen(String op, double zahl1, double zahl2)

    {

        switch (op) {
        case "+":
            ergebnis = zahl1 + zahl2;
            return ergebnis;
        case "-":
            ergebnis = zahl1 - zahl2;
            return ergebnis;
        case "/":
            ergebnis = zahl1 / zahl2;
            return ergebnis;
        case "*":
            ergebnis = zahl1 * zahl2;
            return ergebnis;
        }
        return ergebnis;
    }

    public double meineNemesis() {

        zahl1 = numbersDouble.get(0);

        for (int i = 1; i <= numbersDouble.size(); i++)

        {
            op = operators.get(i - 1);

            if (op.equals("=")) {
                return zahl1;
            }
            zahl2 = numbersDouble.get(i);
            zahl1 = rechnen(op, zahl1, zahl2);
        }
        return -80085;
    }

    public int berechneInt() 
    {
        zahl1 = numbersInt.get(0);

        for (int i = 1; i <= numbersInt.size(); i++)

        {
            op = operators.get(i - 1);

            if (op.equals("=")) {
                return (int)zahl1;
            }
            zahl2 = numbersInt.get(i);
            zahl1 = rechnen(op, zahl1, zahl2);
        }
        return -80085 ;
    }


    public void addNumber(int i) 
    {
        numbersInt.add(i);
    }

    public void addOperators(String op)
    {
        operators.add(op);
        }

}

Большое спасибо заранее

1 Ответ

0 голосов
/ 11 октября 2018

Ваша проблема заключается в том, что вы не настроили макеты и вашего JFrame и JPanel на null, чтобы setBounds(...) вступил в силу.Без явной настройки макета JPanel будет вслепую использовать свой FlowLayout по умолчанию, а JFrame (фактически его contentPane) будет слепо использовать BorderLayout по умолчанию

Так что эти изменения необходимы:

class PannelDez extends JPanel {
    // .....

    public PannelDez() {
        // Panel
        setLayout(null);

        // ....
    }

    // ....
}

class Interface extends JFrame {

    public Interface() {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(null);
        // PanelAdden

        // .....

    }

    // ..........

}

Но, сказав это, я повторяю то, что я говорил ранее:

В то время как нулевые макеты и setBounds () могут показаться новичкам Swing самыми простымии лучший способ создания сложных графических интерфейсов, чем больше у вас Swing GUI, тем больше трудностей вы столкнетесь при их использовании.Они не будут изменять размеры ваших компонентов при изменении размера графического интерфейса, они являются королевской ведьмой для улучшения или поддержки, они полностью терпят неудачу, когда помещаются в полосы прокрутки, они выглядят ужасно при просмотре на всех платформах или разрешениях экрана, которые отличаются от исходного.

И снова, что лучший способ решить эту проблему - изучить и использовать менеджеры по расположению.Например, вы создаете калькулятор, и он хорошо подходит для использования двух JPanel, один для удержания кнопок, использующих GridLayout, чтобы создать сетку кнопок, и другой, использующий BorderLayout для удержания вышеуказанного JPanel.в его центральном положении и удерживайте JTextField в верхнем положении, положение BorderLayout.PAGE_START.Также обратите внимание, что лучше всего избегать дублирования кода, такого как мы видим во всех ваших ActionListeners.Вам нужны только два ActionListener - один для каждой цифровой кнопки и один для каждой операции.

Приведенный ниже код создает графический интерфейс Swing, как описано выше, один с вложенными JPanels, внешний с использованием BorderLayout и внутренний с использованием GridLayout (0, 4), который обозначает переменное количество строк (0),и 4 колонки.Изображение GUI:

enter image description here

и код:

import java.awt.BorderLayout;import java.awt.Font;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;импорт javax.swing. *;

@SuppressWarnings("serial")
public class FooGui02 extends JPanel {
    private static final Font BUTTON_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 36);
    private static final Font ANZEIGE_FONT = new Font(Font.SANS_SERIF, Font.PLAIN, 24);
    private JTextField anzeige = new JTextField(10);
    RechnerInt interfaceRechner = new RechnerInt();

    public FooGui02() {
        anzeige.setFont(ANZEIGE_FONT);
        // anzeige.setEnabled(false);
        anzeige.setBackground(null);
        anzeige.setFocusable(false); // user can't interact with this

        // create a grid of 4 columns and variable rows:
        JPanel btnPanel = new JPanel(new GridLayout(0, 4));

        // create first row
        // add 3 blank JLabels
        for (int i = 0; i < 3; i++) {
            btnPanel.add(new JLabel());
        }
        btnPanel.add(createOperationButton(Operation.DIVISION));

        // second row
        btnPanel.add(createNumberButton(7));
        btnPanel.add(createNumberButton(8));
        btnPanel.add(createNumberButton(9));
        btnPanel.add(createOperationButton(Operation.MULTIPLICATION));

        // third row
        btnPanel.add(createNumberButton(4));
        btnPanel.add(createNumberButton(5));
        btnPanel.add(createNumberButton(6));
        btnPanel.add(createOperationButton(Operation.SUBTRACTION));

        // forth row
        btnPanel.add(createNumberButton(1));
        btnPanel.add(createNumberButton(2));
        btnPanel.add(createNumberButton(3));
        btnPanel.add(createOperationButton(Operation.ADDITION));

        // fifth row
        btnPanel.add(new JLabel());
        btnPanel.add(createNumberButton(0));
        btnPanel.add(createOperationButton(Operation.CLEAR));
        btnPanel.add(createOperationButton(Operation.EQUALS));

        setLayout(new BorderLayout());
        add(anzeige, BorderLayout.PAGE_START);
        add(btnPanel);
    }

    private JButton createOperationButton(Operation operation) {
        JButton button = new JButton(operation.getText());
        button.addActionListener(new OperationListener(operation));
        button.setFont(BUTTON_FONT);
        return button;
    }

    private JButton createNumberButton(int number) {
        JButton button = new JButton("" + number);
        button.addActionListener(new NumberListener(number));
        button.setFont(BUTTON_FONT);
        return button;
    }

    private class OperationListener implements ActionListener {
        private Operation operation;

        public OperationListener(Operation operation) {
            this.operation = operation;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            String text = anzeige.getText();

            switch (operation) {
            case CLEAR:
                interfaceRechner.operators.clear();
                interfaceRechner.numbers.clear();
                interfaceRechner.numbersInt.clear();
                anzeige.setText("");
                break;

            case ADDITION:
                interfaceRechner.addNumber(Integer.valueOf(text));
                interfaceRechner.addOperators("+");
                anzeige.setText("");
                break;

            case SUBTRACTION:
                interfaceRechner.addNumber(Integer.valueOf(text));
                interfaceRechner.addOperators("-");
                anzeige.setText("");
                break;

            case MULTIPLICATION:
                interfaceRechner.addNumber(Integer.valueOf(text));
                interfaceRechner.addOperators("*");
                anzeige.setText("");
                break;

            case DIVISION:
                interfaceRechner.addNumber(Integer.valueOf(text));
                interfaceRechner.addOperators("/");
                anzeige.setText("");
                break;

            case EQUALS:
                interfaceRechner.addNumber(Integer.valueOf(text));
                interfaceRechner.addOperators("=");
                anzeige.setText("" + interfaceRechner.berechneInt());
                interfaceRechner.operators.clear();
                interfaceRechner.numbers.clear();
                interfaceRechner.numbersInt.clear();
                break;

            default:
                break;
            }
        }
    }

    private class NumberListener implements ActionListener {
        private int number;

        public NumberListener(int number) {
            this.number = number;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            String text = anzeige.getText();
            text += number;
            anzeige.setText(text);
        }
    }

    private static void createAndShowGui() {
        FooGui02 mainPanel = new FooGui02();

        JFrame frame = new JFrame("Calculator");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

enum Operation {
    DIVISION("/"), MULTIPLICATION("*"), SUBTRACTION("-"), 
    ADDITION("+"), CLEAR("C"), EQUALS("=");

    private String text;

    private Operation(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
}
...