Java 将Figure添加到JPanel,然后添加到另一个JPanel,然后添加到JFrame
对于我的项目,我必须在一个框架上显示三个不同的图形。我认为我可以做到这一点的方法是,将一个主面板添加到框架中,然后将另外三个框架添加到主框架中。第一个是在特定点上填充的四个圆,第二个是图形,第三个是时钟。目前,我正试图使第一个工作,以便我可以应用到其他两个。我的程序可以编译,但当我运行它时,我只得到一个空白窗口。是什么导致它不显示图形?n00832607类是这样命名的,并且是小写的,因为在我的学校系统上交项目是一种形式,请忽略这一点Java 将Figure添加到JPanel,然后添加到另一个JPanel,然后添加到JFrame,java,swing,graphics,jframe,jpanel,Java,Swing,Graphics,Jframe,Jpanel,对于我的项目,我必须在一个框架上显示三个不同的图形。我认为我可以做到这一点的方法是,将一个主面板添加到框架中,然后将另外三个框架添加到主框架中。第一个是在特定点上填充的四个圆,第二个是图形,第三个是时钟。目前,我正试图使第一个工作,以便我可以应用到其他两个。我的程序可以编译,但当我运行它时,我只得到一个空白窗口。是什么导致它不显示图形?n00832607类是这样命名的,并且是小写的,因为在我的学校系统上交项目是一种形式,请忽略这一点 import java.awt.*; import javax
import java.awt.*;
import javax.swing.*;
import java.util.*;
public class n00832607 extends JFrame {
private JPanel panelMain;
private FourFans panelfans;
public n00832607() {
//Main Panel
panelMain = new JPanel();
add(panelMain);
//Creating Fans
panelfans = new FourFans();
panelMain.add(panelfans);
}
//Main Method
public static void main(String[] args) {
n00832607 frame = new n00832607();
frame.setVisible(true);
frame.setSize(400, 400);
frame.setTitle("Project 6");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//n00832607 Class Finish
class FourFans extends JPanel
{
public FourFans()
{
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(2, 2));
panel.add(new Fan());
panel.add(new Fan());
panel.add(new Fan());
panel.add(new Fan());
}
}
//Responsible for creating Fan
class Fan extends JPanel {
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
int height = getHeight();
int width = getWidth();
g.setColor(Color.BLACK);
g.drawOval((int)(0.09 * width), (int)(0.09*height), (int)(0.825 * height), (int) (0.825 * height));
g.fillArc((int)(0.1 * width), (int)(0.1 * height), (int)(0.8 * width), (int)(0.8 * height), 20, 30);
g.fillArc((int)(0.1 * width), (int)(0.1 * height), (int)(0.8 * width), (int)(0.8 * height), 110, 30);
g.fillArc((int)(0.1 * width), (int)(0.1 * height), (int)(0.8 * width), (int)(0.8 * height), 200, 30);
g.fillArc((int)(0.1 * width), (int)(0.1 * height), (int)(0.8 * width), (int)(0.8 * height), 290, 30);
}
}
编辑
我得到了你建议的工作,现在球迷们出现了,他们非常小,但我可以尝试稍后处理,因为他们现在确实出现了。我曾尝试将此应用于下一个数字,但它似乎不起作用。第一部分现在看起来像
public class n00832607 extends JFrame {
private JPanel panelMain;
private FourFans panelfans;
private SquareFunction panelfunction;
public n00832607() {
//Main Panel
panelMain = new JPanel();
add(panelMain);
//Creating Fans
panelfans = new FourFans();
panelMain.add(panelfans);
//Creating Function
panelfunction = new SquareFunction();
panelMain.add(panelfunction);
}
//Main Method
public static void main(String[] args) {
n00832607 frame = new n00832607();
frame.setSize(400, 400);
frame.setTitle("Project 6");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
这是我正在使用的平方函数的代码。当我运行时,风扇显示得很小,并且有大量的空格,其中square函数可以显示在其中。这是它的一张照片
class SquareFunction extends JPanel
{
public SquareFunction()
{
add(new GraphMaker());
}
}
//Responsible for creating the graph
class GraphMaker extends JPanel {
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
double scaleFactor = 0.1;
Polygon p = new Polygon();
int y = 0;
for(int x = -100; x <= 100; x++)
{
if(y < 200 - (int)(scaleFactor * x * x))
{
y = 200 - (int)(scaleFactor * x * x);
}
p.addPoint(x+200,200-(int)(scaleFactor * x * x));
}
g.setColor(Color.BLACK);
g.drawLine(20, y+1, getWidth() - 50, y+1);
g.drawLine(200, 0, 200, y+1);
g.drawString("X", 345, 200);
g.drawString("Y", 200, 9);
g.setColor(Color.BLUE);
g.drawPolygon(p);
g.setColor(Color.WHITE);
g.drawLine(50, 200 - (int)(scaleFactor * 100 * 100), 300, 200 - (int)(scaleFactor * 100 * 100));
}
}
class SquareFunction扩展了JPanel
{
公共职能()
{
添加(新GraphMaker());
}
}
//负责创建图表
类GraphMaker扩展了JPanel{
受保护组件(图形g)
{
超级组件(g);
双尺度因子=0.1;
多边形p=新多边形();
int y=0;
对于(int x=-100;x我建议您将setVisible
调用移动到方法中的最后一行,并尝试向其中添加一个面板,例如
public static void main(String[] args) {
n00832607 frame = new n00832607();
frame.setSize(400, 400);
frame.setTitle("Project 6");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
class FourFans extends JPanel {
public FourFans() {
setLayout(new GridLayout(2, 2));
add(new Fan());
add(new Fan());
add(new Fan());
add(new Fan());
}
}
这样可以确保在尝试使用框架之前已完成对框架的修改
接下来
class FourFans extends JPanel {
public FourFans() {
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(2, 2));
panel.add(new Fan());
panel.add(new Fan());
panel.add(new Fan());
panel.add(new Fan());
}
}
这是没有意义的。您已经从JPanel
扩展了FourFans
,然后在中创建了另一个JPanel
,取而代之的是,只需尝试直接将Fan
添加到其中……例如
public static void main(String[] args) {
n00832607 frame = new n00832607();
frame.setSize(400, 400);
frame.setTitle("Project 6");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
class FourFans extends JPanel {
public FourFans() {
setLayout(new GridLayout(2, 2));
add(new Fan());
add(new Fan());
add(new Fan());
add(new Fan());
}
}
根据问题的更改进行更新
获得结果的主要原因是,panelMain
默认使用的是FlowLayout
尝试将其更改为使用边框布局
,例如
public static void main(String[] args) {
n00832607 frame = new n00832607();
frame.setSize(400, 400);
frame.setTitle("Project 6");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
class FourFans extends JPanel {
public FourFans() {
setLayout(new GridLayout(2, 2));
add(new Fan());
add(new Fan());
add(new Fan());
add(new Fan());
}
}
setLayout(新的BorderLayout())
将来您可能需要将其更改为网格布局
,但这会让您开始;)我已按您所说的那样将设置移动到可见位置。在代码的开头,我编写了add(panelMain)为什么不起作用?这使它起作用了!通过这次更改,这部分代码似乎不再使用了。private JPanel panelMain;private FourFans panelfans;public n00832607(){//Main Panel panelMain=new JPanel();add(panelMain);//Creating Fans panelfans=new FourFans();panelMain.add(panelfans);}是这样吗?还是我应该保留它?很抱歉,该注释中的代码看起来很潦草。我不知道如何在注释中更好地设置格式。您可能不需要frame.add(new FourFans());
My bad,您应该删除frame.add(new FourFans());
,因为您实际上已经在构造函数中添加了它。我想在这个阶段质疑是否需要panelMain
,但是如果您以后要添加更多内容,您应该能够保留它。。。