#java #class #oop #inheritance #jpanel
#java #класс #ооп #наследование #jpanel
Вопрос:
У меня есть задание создать изображение смайлика в одном классе, используя метод paint (достаточно простой), и с помощью кнопки заставить его отображаться на 9 разных панелях в основном классе. Я прекрасно понимаю кнопку и изображение смайлика, но, похоже, я не могу найти четкого ответа на вопрос, какой наилучший подход к получению объекта, созданного во 2-м классе, в JPanel в 1-м классе.
Код сейчас довольно грубый, но я чувствую, что у меня все правильно изложено в моих таблицах, я просто не знаю, как вызвать метод рисования 2-го класса.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SmileyGrid extends JFrame implements ActionListener
{
public static void main(String[] args)
{
SmileyGrid myGrid = new SmileyGrid();
myGrid.setSize(800, 800);
myGrid.createGUI();
myGrid.setVisible(true);
}
public SmileyGrid()
{
}
private void createGUI()
{
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container window = getContentPane();
//3x3 layout for smileys
GridLayout smileLayout = new GridLayout(3,3);
//Parent panel for smileys
JPanel panelSmiley = new JPanel ();
JPanel mainPanel = new JPanel();
mainPanel.setLayout (smileLayout);
mainPanel.add(panelSmiley);
mainPanel.add(panelSmiley);
mainPanel.add(panelSmiley);
mainPanel.add(panelSmiley);
mainPanel.add(panelSmiley);
mainPanel.add(panelSmiley);
mainPanel.add(panelSmiley);
mainPanel.add(panelSmiley);
mainPanel.add(panelSmiley);
}
public void actionPerformed(ActionEvent ae)
{
}
}
Ответ №1:
Я думаю, что все, что вам нужно сделать, это ввести класс, который расширяет JPanel, и реализовать его метод paintComponent. Затем добавьте новый экземпляр этого класса в каждый раздел сетки. (Я думаю, что если вы создадите его один раз, а затем добавите одну и ту же ссылку несколько раз, у вас могут возникнуть некоторые проблемы)
public class Smiley extends JPanel {
paintComponent(Graphics g) {
//do stuff here
}
}
Это работает, потому что, когда контейнер (например, полученная вами ContentPane) окрашивается, он также вызывает свой дочерний метод paintComponent . Таким образом, вы должны иметь возможность добавить эту пользовательскую JPanel в сетку, как вы написали выше, и любые операции рисования, выполняемые в paintComponent, произойдут!
Также вам, вероятно, следует добавить mainPanel в ваше окно, иначе оно не будет отображаться.
Комментарии:
1. Мне нужно, чтобы второй класс был отдельным файлом Java, а не просто добавленным классом в тот же файл.
2. Это не должно быть проблемой, вы должны иметь возможность использовать класс из другого файла без проблем, если оба файла находятся в одном пакете 🙂