Как мне сделать копию JPanel со всеми ее j-компонентами, имеющими те же функции, что и исходная панель? - PullRequest
0 голосов
/ 17 апреля 2020

Это проект gui преобразований. У меня есть jcombobox, который обновляет мой jpanel jpTransDetails, выполняющий перевод, вращение и т. Д. c при выборе на соответствующей кнопке j. Теперь мне нужно работать над другой частью, где я хочу получить точную копию этих деталей преобразования jcomboBox и JPanel, имеющих те же функции, что и эта. Каков наилучший способ добиться этого?

Обратите внимание, что я показал вам только часть кода, чтобы он не был длинным. Части повторяются для других преобразований.

ОБНОВЛЕНИЕ: я попытался создать базовый c пример добавления новой jpanel к jpanel с помощью класса, но он не работает

   transNameList = new String[] {"Translation","Rotation","Scaling","Shear","Reflection"};
    jcbTranslations = new JComboBox(transNameList);

    mPane.add(jcbTranslations); //mPane is my main jpanel

    //transDetails JPANEL
    jpTransDetails = new JPanel(null);
    jpTransDetails.setBounds(10,95,320,103);
    jpTransDetails.setOpaque(false);
    Border border = BorderFactory.createLineBorder(Color.white);
    jpTransDetails.setBorder(border);



    //TRANSLATION

    JLabel lblTx = new JLabel("Enter X-Coordinate: ");
    lblTx.setForeground(Color.BLACK);
    lblTx.setFont(new Font("Segoe UI", Font.PLAIN, 12));
    lblTx.setBounds(10,6,150,12);
    lblTx.setToolTipText("Number of units moved along x-axis");

    tTx = new JTextField();
    tTx.setText("0");
    tTx.setColumns(10);
    tTx.setBounds(175, 4, 50, 18);

    JLabel lblTy = new JLabel("Enter Y-Coordinate: ");
    lblTy.setForeground(Color.black);
    lblTy.setFont(new Font("Segoe UI", Font.PLAIN, 12));
    lblTy.setBounds(10, 60, 150, 12);
    lblTy.setToolTipText("Number of units moved along y-axis");



    tTy = new JTextField();
    tTy.setText("0");
    tTy.setColumns(10);
    tTy.setBounds(175, 60, 50, 18);


    bTranslate = new JButton("TRANSLATE");
    bTranslate.setBounds(210,1,110, 25);
    bTranslate.setBackground(Color.black);
    bTranslate.setForeground(Color.WHITE);

    //JPANEL FOR TRANSFORMATION BUTTON
    jpTransBtn =new JPanel(null);
    jpTransBtn.setBounds(10,200,320,28);
    jpTransBtn.setOpaque(false);

    jpTransDetails.setBounds(10,95,320,100);


    //ADDING FOR TRANSLATION 
    jpTransDetails.add(lblTx);
    jpTransDetails.add(tTx);
    jpTransDetails.add(lblTy);
    jpTransDetails.add(tTy);

    //ADDING TRANSLATION BUTTON
    jpTransBtn.add(bTranslate);

    mPane.add(jpTransDetails);
    mPane.add(jpTransBtn);


    //ITEM LISTENER FOR jcbTranslations
    jcbTranslations.addItemListener(new ItemListener()
            {
                public void itemStateChanged(ItemEvent event)
                {
                    if (event.getStateChange() == ItemEvent.SELECTED)
                    {
                        if (jcbTranslations.getSelectedIndex()==0) //TRANSLATION
                        {
                            jpTransDetails.removeAll();
                            jpTransDetails.repaint();

                            jpTransBtn.removeAll();
                            jpTransBtn.repaint();

                            //ADDING FOR TRANSLATION 
                            jpTransDetails.add(lblTx);
                            jpTransDetails.add(tTx);
                            jpTransDetails.add(lblTy);
                            jpTransDetails.add(tTy);

                            //ADDING TRANSLATION BUTTON
                            jpTransBtn.add(bTranslate);


                        }

                        if (jcbTranslations.getSelectedIndex()==1) //ROTATION
                        {
                            jpTransDetails.removeAll();
                            jpTransDetails.repaint();

                            jpTransBtn.removeAll();
                            jpTransBtn.repaint();

                            //ADDING FOR ROTATION
                            jpTransDetails.add(lblRx);
                            jpTransDetails.add(Rotx);
                            jpTransDetails.add(lblRy);
                            jpTransDetails.add(Roty);
                            jpTransDetails.add(lblAngx);
                            jpTransDetails.add(tAngle);


                            //ADDING ROTATION BUTTON
                            jpTransBtn.add(bRotate);


                        }

ОБНОВЛЕНИЕ

   public class MainPanelClass extends JFrame   
   {
     public static JPanel selectionpanel;

     MainPanelClass()
     {
       selectionpanel = new JPanel();
       selectionpanel.setPreferredSize(new Dimension(100,200));
       selectionpanel.setBackground(Color.BLUE);
       selectionpanel.add(new CompositeTransformationsPanel());
       add(selectionpanel);

     }

   public static void main(String[] args)
   {
      MainPanelClass mpc = new MainPanelClass();
      mpc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      mpc.setVisible(true);
      mpc.setSize(300,400);
  }

}

   This is my class extending a jpanel

   public class CompositeTransformationsPanel extends JPanel
   {
        CompositeTransformationsPanel()
        {
          setPreferredSize(new Dimension(20,10));
          setBackground(Color.red);
          setOpaque(false);
        }
   }

1 Ответ

1 голос
/ 17 апреля 2020

Лучший способ сделать это - создать класс, который либо расширяет JPanel, либо содержит JPanel по составу, и его задачей является создание этого компонента, представляющего интерес, совершенно одинаковым образом каждый раз. Если вам нужно использовать обе модели для совместного использования моделей, вы можете предоставить этому классу конструктор копирования, в котором он извлекает модели из всех компонентов и помещает те же модели во вновь созданный JPanel.

Другие рекомендации:

  • Избегайте пустых макетов и setBounds, так как это приводит к жестким GUI, которые не могут адаптироваться к различным операционным системам или применениям. Гораздо лучше изучать и использовать менеджеры компоновки.
  • Попробуйте разделить код модели - часть вашей программы, не относящуюся к GUI logi c, а представление - часть GUI, насколько это возможно. Это облегчит достижение такого рода вещей и значительно упростит отладку и тестирование кода.
  • Вместо того, чтобы удалять и заменять компоненты вручную, гораздо лучше менять компоненты с помощью CardLayout , что значительно упрощает и делает более безопасным обмен *

При просмотре вашего кода мои рекомендации изменились. Похоже, вы хотите создать форму ввода для выполнения преобразования точек и изменить тип преобразования в зависимости от выбора, сделанного в JComboBox. Если да, то мои рекомендации:

  • Возможно, нет необходимости создавать несколько похожих JPanels и менять JPanels
  • Вместо этого используйте один JPanel для всего этого
  • Дайте его один JButton, скажем, под названием «Submit»
  • . Дайте этому JButton ActionListner
  • . В этом слушателе проверьте текущее состояние JComboBox, его выбранного элемента
  • . расчет на основе выбранного элемента.

Например:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.border.Border;

@SuppressWarnings("serial")
public class PointManipulationPanel extends JPanel {
    private static final int GAP = 5;
    private JComboBox<Transform> transformCombo = new JComboBox<Transform>(Transform.values());
    private JTextField xCoordField = new JTextField("0", 5);
    private JTextField yCoordField = new JTextField("0", 5);

    public PointManipulationPanel() {   
        JPanel coordinatePanel = new JPanel(new GridBagLayout());
        Border outsideBorder = BorderFactory.createLineBorder(Color.WHITE);
        Border insideBorder = BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP);
        Border border = BorderFactory.createCompoundBorder(outsideBorder, insideBorder);
        coordinatePanel.setBorder(border);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(GAP, GAP, GAP, GAP);
        coordinatePanel.add(new JLabel("Enter X-Coordinate: "), gbc);
        gbc.gridy = 1;
        coordinatePanel.add(new JLabel("Enter Y-Coordinate: "), gbc);

        gbc.gridx = 1;
        gbc.gridy = 0;
        coordinatePanel.add(xCoordField, gbc);
        gbc.gridy = 1;
        coordinatePanel.add(yCoordField, gbc);

        JPanel topPane = new JPanel();
        topPane.add(transformCombo);

        JButton submitButton = new JButton("Submit");
        submitButton.addActionListener(e -> submitActionPerformed(e));
        JPanel bottomPanel = new JPanel();
        bottomPanel.add(submitButton);

        setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        setLayout(new BorderLayout(GAP, GAP));
        add(topPane, BorderLayout.PAGE_START);
        add(coordinatePanel);
        add(bottomPanel, BorderLayout.PAGE_END);
    }

    private void submitActionPerformed(ActionEvent e) {
        int x = 0;
        int y = 0;
        try {
            x = Integer.parseInt(xCoordField.getText());
            y = Integer.parseInt(yCoordField.getText());
        } catch (NumberFormatException nfe) {
            // warn user with JOptionPane that data entered no goo
            String message = "Invalid number entry";
            String title = "Invalid Data";
            int messageType = JOptionPane.ERROR_MESSAGE;
            JOptionPane.showMessageDialog(PointManipulationPanel.this, message, title, messageType);

            // exit method
            return;
        }

        // use x and y here in the calculations
        Transform transform = (Transform) transformCombo.getSelectedItem();
        switch (transform) {
        case TRANSLATION:
            // TODO: real code to do calculations goes here
            System.out.printf("Do translation here on x and y: [%d, %d]%n", x, y);
            break;
        case ROTATION:
            // TODO: real code to do calculations goes here
            System.out.printf("Do rotation here on x and y: [%d, %d]%n", x, y);
            break;
        case SCALING:
            // TODO: real code to do calculations goes here
            System.out.printf("Do scaling here on x and y: [%d, %d]%n", x, y);
            break;
        case SHEAR:
            // TODO: real code to do calculations goes here
            System.out.printf("Do shear here on x and y: [%d, %d]%n", x, y);
            break;
        case REFLECTION:
            // TODO: real code to do calculations goes here
            System.out.printf("Do reflection here on x and y: [%d, %d]%n", x, y);
            break;
        default:
            throw new IllegalArgumentException("Unexpected value: " + transform);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            PointManipulationPanel mainPanel = new PointManipulationPanel();
            JFrame frame = new JFrame("Foo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(mainPanel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}
enum Transform {
    TRANSLATION("Translation"), ROTATION("Rotation"), SCALING("Scaling"), SHEAR("Shear"), REFLECTION("Reflection");

    private String name;

    private Transform(String name) {
        this.name = name;
    }

    String getName() {
        return name;
    }

    @Override
    public String toString() {
        return name;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...