java - 如何调用另一个 class.java 文件作为对象添加到 JPanel
问题描述
我有一个任务是使用paint方法(足够简单)在一个类中创建一个笑脸图形,并使用一个按钮使其出现在主类的9个不同面板中。我很好地理解了按钮和笑脸的绘画,但我似乎无法找到一个明确的答案,即在第一堂课中将第二堂课中创建的对象带入 JPanel 的最佳方法是什么。
代码现在非常粗糙,但我觉得我的表格已经正确布置了所有内容,我只是不知道如何调用第二类的绘制方法。
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)
{
}
}
解决方案
我认为你需要做的就是引入一个扩展 JPanel 的类并实现它的 paintComponent 方法。然后将此类的新实例添加到网格的每个部分。(我认为如果您实例化一次然后多次添加相同的引用,您可能会遇到一些问题)
public class Smiley extends JPanel {
paintComponent(Graphics g) {
//do stuff here
}
}
这是有效的,因为当绘制容器(例如您获得的 contentPane)时,它也会调用其子项的 paintComponent 方法。因此,您应该能够像上面所写的那样将这个自定义 JPanel 添加到网格中,并且paintComponent 中发生的任何绘制操作都会发生!
此外,您可能应该将 mainPanel 添加到您的窗口,否则它将不会显示。
推荐阅读
- c# - 使用 System.Text.Json 通过私有设置器反序列化属性
- c++ - Gtkmm 窗口是空白的,没有显示任何小部件或标题
- c# - 如何构建可查询以从数据库列中查找字符串数组的所有单词
- node.js - http 发布到“https”url 的主体是否在 HTTP 飞镖颤振包中或一般情况下被加密?不知道怎么问这个问题,请看下面的简要说明
- json - (预)处理存储在 json 中的大型数据集的最有效方法是什么?
- vuetify.js - 使用 v-checkbox Vuetify v-list - v-model 无法正常工作
- reactjs - 使用 React 传递动态 url
- python - Windows 10 上的 Python - 鼠标悬停时查找窗口名称
- python-2.7 - 列表理解:如果元素是同一列表中另一个元素的子字符串,则忽略该元素
- javascript - 从 .js 文件中获取数据