Я не уверен, какова ваша цель, что заставляет вас задавать этот вопрос, но если вы пытаетесь реорганизовать код, чтобы позволить вам создавать меньшие и более управляемые классы, это не так, как вам следует поступая так, как будто вы неправильно используете наследование, в ситуации, когда композиция будет иметь больше смысла. Вместо этого я бы предложил вам:
- Создание отдельных классов для карт JPanel, которые меняются в контейнере с использованием карт
- Создайте отдельный класс или классы, чтобы помочь контролировать обмен картами, «движок» обмена карт, если хотите.
- Наследуйте осторожно и по уважительной причине, особенно если вы хотите каким-то образом изменить врожденное поведение класса, например, рисование JPanel
Другие проблемы с вашим кодом и вашим вопросом:
- Нет, где вы создаете экземпляры test1 или test2, а вместо этого, похоже, создаете экземпляр совершенно другого класса,
ttt
. Из-за отсутствия в вашем коде объявленных переменных нам сложно воспроизвести вашу проблему, чтобы понять, что вы делаете неправильно. Насколько нам известно, вы не можете создавать экземпляр test2 или использовать его.
- Вам следует избегать использования нулевого макета и использования
setBounds(...)
для размещения компонентов, поскольку это делает для очень негибкого графического интерфейса пользователя то, что, хотя они могут хорошо выглядеть на одной платформе, выглядят ужасно на большинстве других платформ или разрешений экрана, и которые очень трудно обновлять и поддерживать.
- Кроме того, вы захотите изучить и использовать Соглашения об именах Java . Имена переменных должны начинаться со строчной буквы, а имена классов - с заглавной. Изучение этого и последующее позволят нам лучше понять ваш код и лучше понять код других.
Например, см. Код ниже. Обратите внимание, что он написан так, что все это можно скопировать и вставить непосредственно в IDE, поскольку только один класс CardExample, класс с методом main, является общедоступным и имеет все операции импорта:
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.Paint;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
public class CardExample {
private static void createAndShowGui() {
CardExampleMain cardUser = new CardExampleMain();
JFrame frame = new JFrame("Card Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(cardUser.getMainPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
class CardExampleMain {
private JPanel mainPanel = new JPanel();
private CardUser cardUser = new CardUser();
private Card1 card1 = new Card1(cardUser);
private Card2 card2 = new Card2(cardUser);
private Card3 card3 = new Card3(cardUser);
private JComboBox<String> cardKeyBox;
public CardExampleMain() {
cardUser.addCard(card1, card1.getName());
cardUser.addCard(card2, card2.getName());
cardUser.addCard(card3, card3.getName());
int itemsSize = cardUser.getKeys().size();
String[] items = cardUser.getKeys().toArray(new String[itemsSize]);
cardKeyBox = new JComboBox<>(items);
cardKeyBox.setSelectedIndex(-1);
cardKeyBox.addActionListener(e -> cardUser.show(cardKeyBox.getSelectedItem().toString()));
JPanel topPanel = new JPanel();
topPanel.setBorder(BorderFactory.createEtchedBorder());
topPanel.add(new JLabel("Select Card:"));
topPanel.add(cardKeyBox);
mainPanel.setLayout(new BorderLayout());
mainPanel.add(cardUser.getMainPanel());
mainPanel.add(topPanel, BorderLayout.PAGE_START);
}
public JPanel getMainPanel() {
return mainPanel;
}
}
class CardUser {
private CardLayout cardLayout = new CardLayout();
private JPanel mainPanel = new JPanel(cardLayout);
private List<String> keys = new ArrayList<>();
public JPanel getMainPanel() {
return mainPanel;
}
public void addCard(Component component, String key) {
mainPanel.add(component, key);
keys.add(key);
}
public void show(String key) {
cardLayout.show(mainPanel, key);
}
public void next() {
cardLayout.next(mainPanel);
}
public void previous() {
cardLayout.previous(mainPanel);
}
public List<String> getKeys() {
return keys;
}
}
@SuppressWarnings("serial")
abstract class CardPanel extends JPanel {
private static final int EB_GAP = 5;
protected CardUser cardUser;
protected Action nextAction;
protected Action previousAction;
protected Action showAction;
public CardPanel(CardUser cardUser) {
this.cardUser = cardUser;
nextAction = new CardAction("Next", KeyEvent.VK_N, e -> cardUser.next());
previousAction = new CardAction("Previous", KeyEvent.VK_P, e -> cardUser.previous());
setBorder(BorderFactory.createEmptyBorder(EB_GAP, EB_GAP, EB_GAP, EB_GAP));
setLayout(new BorderLayout());
JPanel buttonPanel = new JPanel();
buttonPanel.setOpaque(false);
buttonPanel.add(new JButton(previousAction));
buttonPanel.add(new JButton(nextAction));
add(buttonPanel, BorderLayout.PAGE_END);
}
}
@SuppressWarnings("serial")
class CardAction extends AbstractAction {
private ActionListener listener;
public CardAction(String name, int mnemonic, ActionListener listener) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
this.listener = listener;
}
@Override
public void actionPerformed(ActionEvent e) {
listener.actionPerformed(e);
}
}
@SuppressWarnings("serial")
class Card1 extends CardPanel {
public static final String NAME = "Card 1";
private static final Color COLOR_1 = Color.PINK;
private static final Color COLOR_2 = new Color(150, 150, 255);
private static final float WDTH = 20f;
private static final int LBL_GAP = 40;
public Card1(CardUser cardUser) {
super(cardUser);
setName(NAME);
JLabel label = new JLabel(NAME);
label.setFont(label.getFont().deriveFont(Font.BOLD, 128));
label.setBorder(BorderFactory.createEmptyBorder(LBL_GAP, LBL_GAP, LBL_GAP, LBL_GAP));
add(label);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Paint paint = new GradientPaint(0f, 0f, COLOR_1, WDTH, WDTH, COLOR_2, true);
g2.setPaint(paint);
g2.fillRect(0, 0, getWidth(), getHeight());
}
}
@SuppressWarnings("serial")
class Card2 extends CardPanel {
public static final String NAME = "Card 2";
private static final Color COLOR_1 = Color.BLACK;
private static final Color COLOR_2 = Color.BLUE;
private static final Color LABEL_FG = Color.LIGHT_GRAY;
private static final String[] DATA = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
private JLabel label = new JLabel("Card 2", SwingConstants.CENTER);
private JComboBox<String> comboBox = new JComboBox<>(DATA);
public Card2(CardUser cardUser) {
super(cardUser);
setName(NAME);
label.setForeground(LABEL_FG);
JPanel centralPanel = new JPanel(new GridBagLayout());
centralPanel.setOpaque(false);
centralPanel.add(comboBox);
add(label, BorderLayout.PAGE_START);
add(centralPanel);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Paint paint = new GradientPaint(0f, 0f, COLOR_1, getWidth(), getHeight(), COLOR_2, false);
g2.setPaint(paint);
g2.fillRect(0, 0, getWidth(), getHeight());
}
}
@SuppressWarnings("serial")
class Card3 extends CardPanel {
public static final String NAME = "Card 3";
public Card3(CardUser cardUser) {
super(cardUser);
setName(NAME);
add(new JLabel(NAME, SwingConstants.CENTER));
// TODO put more components in here
}
}