Лучший способ сделать это - создать класс, который либо расширяет 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;
}
}