Как вызвать другой class.java файл как объект для добавления в JPanel

#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. Это не должно быть проблемой, вы должны иметь возможность использовать класс из другого файла без проблем, если оба файла находятся в одном пакете 🙂