Java 扩展JPanel在添加到另一个JPanel时显示为微小

Java 扩展JPanel在添加到另一个JPanel时显示为微小,java,swing,user-interface,jpanel,graphics2d,Java,Swing,User Interface,Jpanel,Graphics2d,我试图将2个扩展的JPanel添加到JPanel或JFrame中,但即使我设置了一个大小,它们都显示得非常小。代码如下

我试图将2个扩展的JPanel添加到JPanel或JFrame中,但即使我设置了一个大小,它们都显示得非常小。代码如下是构建GUI的类

trial.java tile.java
导入java.awt.AlphaComposite;
导入java.awt.BasicStroke;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Point;
导入java.awt.Polygon;
导入java.awt.Toolkit;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.geom.Arc2D;
导入java.awt.geom.Line2D;
导入java.awt.geom.QuadCurve2D;
导入java.awt.image.buffereImage;
导入javax.swing.BorderFactory;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.border.border;
公共类tile扩展JPanel实现MouseListener{
私有字符串[]tilePath=新字符串[3];
私有颜色[]tileColors=新颜色[3];
私有整数x=100,y=100;
公共磁贴(字符串[]路径,颜色[]颜色){
瓷砖路径=路径;
tileColors=颜色;
addMouseListener(这个);
}
公共组件(图形g){
超级组件(g);
BuffereImage tileImage=新的BuffereImage(100100,BuffereImage.TYPE_INT_ARGB);
Graphics2D tile=tileImage.createGraphics();
int-edgeLength=tileImage.getWidth()/2;
多边形六边形=新多边形();
点[]顶点=新点[6];
对于(int i=0;i<6;i++)
{vertex[i]=新点((int)(edgeLength+edgeLength*Math.cos(i*2*Math.PI/6)),(int)(edgeLength+edgeLength*Math.sin(i*2*Math.PI/6));
添加点(顶点[i].x,顶点[i].y);
}
瓷砖。设置颜色(颜色。黑色);
瓷砖。填充多边形(六边形);
setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN));
调整行程(新基本行程(10));
int vertexIndex=0;

对于(int i=0;i每个面板都应该覆盖
getPreferredSize()
以返回一个合理的值。这是布局管理器最可能遵循的值

另见(是)

例如

import java.awt.*;
导入java.awt.event.*;
导入java.awt.geom.*;
导入java.awt.image.buffereImage;
导入javax.swing.*;
导入javax.swing.border.border;
公开庭审{
公共静态void main(字符串参数[]){
JFrame窗口=新JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel content=新的JPanel();
content.setLayout(新的FlowLayout(FlowLayout.LEFT));
内容.背景(颜色.黑色);
tile t1=新tile(新字符串[]{“弧”、“曲线”、“曲线”},新颜色[]{Color.GREEN、Color.RED、Color.YELLOW});
内容。添加(t1);
添加(新网格模型((0.7*1000)/21));
添加(内容);
window.pack();
window.setVisible(true);
}
}
类tile扩展JPanel实现MouseListener{
私有字符串[]tilePath=新字符串[3];
私有颜色[]tileColors=新颜色[3];
私有整数x=100,y=100;
公共磁贴(字符串[]路径,颜色[]颜色){
瓷砖路径=路径;
tileColors=颜色;
addMouseListener(这个);
}
公共组件(图形g){
超级组件(g);
BuffereImage tileImage=新的BuffereImage(100100,BuffereImage.TYPE_INT_ARGB);
Graphics2D tile=tileImage.createGraphics();
int-edgeLength=tileImage.getWidth()/2;
多边形六边形=新多边形();
点[]顶点=新点[6];
对于(int i=0;i<6;i++){
顶点[i]=新点((int)(边长+边长*数学cos(i*2*数学PI/6)),(int)(边长+边长*数学sin(i*2*数学PI/6));
添加点(顶点[i].x,顶点[i].y);
}
瓷砖。设置颜色(颜色。黑色);
瓷砖。填充多边形(六边形);
setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN));
调整行程(新基本行程(10));
int vertexIndex=0;
对于(int i=0;i<3;i++){
if(tilePath[i]=“弧”){
Arc2D.Double弧=新的Arc2D.Double();
arc.setArcByCenter(顶点[vertexIndex].x,顶点[vertexIndex].y,边长度/2,0,360,Arc2D.OPEN);
瓷砖颜色(瓷砖颜色[i]);
瓷砖。绘制(圆弧);
vertexIndex++;
}else if(波浪路径[i]=“曲线”){
点中点1=新点((顶点[vertexIndex].x+顶点[vertexIndex+1].x)/2,(顶点[vertexIndex].y+顶点[vertexIndex+1].y)/2);
点中点2=新点((顶点[vertexIndex+2].x+顶点[vertexIndex+3].x)/2,(顶点[vertexIndex+2].y+顶点[vertexIndex+3].y)/2);
瓷砖颜色(瓷砖颜色[i]);
平铺绘制(新的四边形曲线2d.Float(中点1.x,中点1.y,边长,边长,中点2.x,中点2.y));
vertexIndex++;
}否则{
点中点1=新点((顶点[vertexIndex].x+顶点[vertexIndex+1].x)/2,(顶点[vertexIndex].y+顶点[vertexIndex+1].y)/2);
点中点2=新点((顶点[vertexIndex+3].x+顶点[vertexIndex+4].x)/2,(顶点[vertexIndex+3].y+顶点[vertexIndex+4].y)/2);
瓷砖颜色(瓷砖颜色[i]);
绘制(新的Line2D.Float(midPoint1.x,midPoint1.y,midPoint2.x,midPoint2.y));
vertexIndex++;
}
}
Graphics2D FinishedFile=(Graphics2D)g;
Border Border=BorderFactory.createLineBorder(Color.BLUE);
FinishedFile.drawImage(tileImage,x,y,null);
}
@凌驾
公共void mouseClicked(MouseEvent事件){
//TODO自动生成的方法存根
System.out.println(“单击”);
x=event.getX();
y=event.getY();
重新油漆();
}
@凌驾
公共无效鼠标事件(鼠标事件){
import java.awt.Color;
import java.awt.FlowLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class trial {
public static void main(String args[]){

    JFrame window=new JFrame();
    window.setSize(1900, 800);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel content=new JPanel();
    content.setLayout(new FlowLayout(FlowLayout.LEFT));
    content.setBackground(Color.BLACK);
    tile t1=new tile(new String[]{"arc","curve", "curve"}, new Color[]{Color.GREEN, Color.RED, Color.YELLOW});
    //t1.setSize(100, 100);
    content.add(t1);
    content.add(new gridModel((0.7*1000)/21));


    window.add(content);
    //window.add(new gridModel((0.7*1000)/21));
    //window.add(new tile(new String[]{"arc","curve", "curve"}, new Color[]{Color.GREEN, Color.RED, Color.YELLOW}));
    //window.pack();
    window.setVisible(true);
}
}
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Arc2D;
import java.awt.geom.Line2D;
import java.awt.geom.QuadCurve2D;
import java.awt.image.BufferedImage;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.Border;

public class tile extends JPanel implements MouseListener{

private String[] tilePaths=new String[3];
private Color[] tileColors=new Color[3];
private int x=100, y=100;

public tile(String[] paths, Color[] colors){
    tilePaths=paths;
    tileColors=colors;
    addMouseListener(this);
}

public void paintComponent(Graphics g){
    super.paintComponent(g);
    BufferedImage tileImage=new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
    Graphics2D tile=tileImage.createGraphics();

    int edgeLength=tileImage.getWidth()/2;
    Polygon hexagon = new Polygon();
    Point[] vertex=new Point[6];
    for (int i = 0; i < 6; i++)
    {   vertex[i]=new Point((int) (edgeLength+ edgeLength*Math.cos(i * 2 * Math.PI / 6)), (int) (edgeLength+ edgeLength*Math.sin(i * 2 * Math.PI / 6)));
        hexagon.addPoint(vertex[i].x, vertex[i].y);
    }

    tile.setColor(Color.black);
    tile.fillPolygon(hexagon);
    tile.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN));
    tile.setStroke(new BasicStroke(10));

    int vertexIndex=0;
    for(int i=0; i<3; i++)
    {   if(tilePaths[i]=="arc")
        {   Arc2D.Double arc=new Arc2D.Double();
            arc.setArcByCenter(vertex[vertexIndex].x, vertex[vertexIndex].y, edgeLength/2, 0, 360, Arc2D.OPEN);
            tile.setColor(tileColors[i]);
            tile.draw(arc);
            vertexIndex++;
        }
        else if(tilePaths[i]=="curve")
        {   Point midPoint1=new Point((vertex[vertexIndex].x+vertex[vertexIndex+1].x)/2, (vertex[vertexIndex].y+vertex[vertexIndex+1].y)/2);
            Point midPoint2=new Point((vertex[vertexIndex+2].x+vertex[vertexIndex+3].x)/2, (vertex[vertexIndex+2].y+vertex[vertexIndex+3].y)/2);
            tile.setColor(tileColors[i]);
            tile.draw(new QuadCurve2D.Float(midPoint1.x, midPoint1.y, edgeLength, edgeLength, midPoint2.x, midPoint2.y));
            vertexIndex++;
        }
        else
        {   Point midPoint1=new Point((vertex[vertexIndex].x+vertex[vertexIndex+1].x)/2, (vertex[vertexIndex].y+vertex[vertexIndex+1].y)/2);
            Point midPoint2=new Point((vertex[vertexIndex+3].x+vertex[vertexIndex+4].x)/2, (vertex[vertexIndex+3].y+vertex[vertexIndex+4].y)/2);
            tile.setColor(tileColors[i]);
            tile.draw(new Line2D.Float(midPoint1.x, midPoint1.y, midPoint2.x, midPoint2.y));
            vertexIndex++;
        }
    }

    Graphics2D finishedTile=(Graphics2D) g;
    Border border = BorderFactory.createLineBorder(Color.BLUE);
    finishedTile.drawImage(tileImage, x, y, null);
}

@Override
public void mouseClicked(MouseEvent event) {
    // TODO Auto-generated method stub
    System.out.println("Click");
    x=event.getX();
    y=event.getY();
    repaint();
}

@Override
public void mouseEntered(MouseEvent event) {
    // TODO Auto-generated method stub
    System.out.println("Entered");
}

@Override
public void mouseExited(MouseEvent event) {
    // TODO Auto-generated method stub
    System.out.println("Exited");
}

@Override
public void mousePressed(MouseEvent event) {
    // TODO Auto-generated method stub
    System.out.println("Pressed");
}

@Override
public void mouseReleased(MouseEvent event) {
    // TODO Auto-generated method stub
    System.out.println("Released");
}


}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class gridModel extends JPanel{

private double sideLength;

public gridModel(double hexagonSide){
    sideLength=hexagonSide;
}

public void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;
    double fromLeft=0, fromTop=sideLength;

    for (int i=0; i<14; i++){
        if(i%2==0)
        {   fromLeft=sideLength;
        }
        else
        {   fromLeft=(2.5)*sideLength;
        }

        for(int j=0; j<7; j++){
            Polygon hexagon = buildHexagon(fromLeft, fromTop);
            g2.setColor(Color.green);
            g2.drawPolygon(hexagon);
            fromLeft+=3*sideLength;
        }

        fromTop+=0.865*sideLength;
    }
}

private Polygon buildHexagon(double leftMargin, double topMargin){
    Polygon hexagon = new Polygon();
    for (int i=0; i<6; i++){
        hexagon.addPoint((int) (leftMargin+ sideLength*Math.cos(i*2*Math.PI/6)), (int) (topMargin+ sideLength*Math.sin(i*2*Math.PI/6)));
    }
    return hexagon;
}

/*public static void main(String args[]){
    JFrame window=new JFrame();
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    window.setSize(screenSize.width, screenSize.height);
    window.add(new gridModel((0.7*screenSize.width)/21));
    window.setVisible(true);
}*/
}
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.Border;

public class trial {

    public static void main(String args[]) {

        JFrame window = new JFrame();
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel content = new JPanel();
        content.setLayout(new FlowLayout(FlowLayout.LEFT));
        content.setBackground(Color.BLACK);
        tile t1 = new tile(new String[]{"arc", "curve", "curve"}, new Color[]{Color.GREEN, Color.RED, Color.YELLOW});
        content.add(t1);
        content.add(new gridModel((0.7 * 1000) / 21));

        window.add(content);
        window.pack();
        window.setVisible(true);
    }
}

class tile extends JPanel implements MouseListener {

    private String[] tilePaths = new String[3];
    private Color[] tileColors = new Color[3];
    private int x = 100, y = 100;

    public tile(String[] paths, Color[] colors) {
        tilePaths = paths;
        tileColors = colors;
        addMouseListener(this);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        BufferedImage tileImage = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
        Graphics2D tile = tileImage.createGraphics();

        int edgeLength = tileImage.getWidth() / 2;
        Polygon hexagon = new Polygon();
        Point[] vertex = new Point[6];
        for (int i = 0; i < 6; i++) {
            vertex[i] = new Point((int) (edgeLength + edgeLength * Math.cos(i * 2 * Math.PI / 6)), (int) (edgeLength + edgeLength * Math.sin(i * 2 * Math.PI / 6)));
            hexagon.addPoint(vertex[i].x, vertex[i].y);
        }

        tile.setColor(Color.black);
        tile.fillPolygon(hexagon);
        tile.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN));
        tile.setStroke(new BasicStroke(10));

        int vertexIndex = 0;
        for (int i = 0; i < 3; i++) {
            if (tilePaths[i] == "arc") {
                Arc2D.Double arc = new Arc2D.Double();
                arc.setArcByCenter(vertex[vertexIndex].x, vertex[vertexIndex].y, edgeLength / 2, 0, 360, Arc2D.OPEN);
                tile.setColor(tileColors[i]);
                tile.draw(arc);
                vertexIndex++;
            } else if (tilePaths[i] == "curve") {
                Point midPoint1 = new Point((vertex[vertexIndex].x + vertex[vertexIndex + 1].x) / 2, (vertex[vertexIndex].y + vertex[vertexIndex + 1].y) / 2);
                Point midPoint2 = new Point((vertex[vertexIndex + 2].x + vertex[vertexIndex + 3].x) / 2, (vertex[vertexIndex + 2].y + vertex[vertexIndex + 3].y) / 2);
                tile.setColor(tileColors[i]);
                tile.draw(new QuadCurve2D.Float(midPoint1.x, midPoint1.y, edgeLength, edgeLength, midPoint2.x, midPoint2.y));
                vertexIndex++;
            } else {
                Point midPoint1 = new Point((vertex[vertexIndex].x + vertex[vertexIndex + 1].x) / 2, (vertex[vertexIndex].y + vertex[vertexIndex + 1].y) / 2);
                Point midPoint2 = new Point((vertex[vertexIndex + 3].x + vertex[vertexIndex + 4].x) / 2, (vertex[vertexIndex + 3].y + vertex[vertexIndex + 4].y) / 2);
                tile.setColor(tileColors[i]);
                tile.draw(new Line2D.Float(midPoint1.x, midPoint1.y, midPoint2.x, midPoint2.y));
                vertexIndex++;
            }
        }

        Graphics2D finishedTile = (Graphics2D) g;
        Border border = BorderFactory.createLineBorder(Color.BLUE);
        finishedTile.drawImage(tileImage, x, y, null);
    }

    @Override
    public void mouseClicked(MouseEvent event) {
        // TODO Auto-generated method stub
        System.out.println("Click");
        x = event.getX();
        y = event.getY();
        repaint();
    }

    @Override
    public void mouseEntered(MouseEvent event) {
        // TODO Auto-generated method stub
        System.out.println("Entered");
    }

    @Override
    public void mouseExited(MouseEvent event) {
        // TODO Auto-generated method stub
        System.out.println("Exited");
    }

    @Override
    public void mousePressed(MouseEvent event) {
        // TODO Auto-generated method stub
        System.out.println("Pressed");
    }

    @Override
    public void mouseReleased(MouseEvent event) {
        // TODO Auto-generated method stub
        System.out.println("Released");
    }

    @Override 
    public Dimension getPreferredSize() {
        return new Dimension(2*x, 2*y);
    }
}

class gridModel extends JPanel {

    private double sideLength;

    @Override 
    public Dimension getPreferredSize() {
        return new Dimension(2*(int)sideLength, 2*(int)sideLength);
    }

    public gridModel(double hexagonSide) {
        sideLength = hexagonSide;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        double fromLeft = 0, fromTop = sideLength;

        for (int i = 0; i < 14; i++) {
            if (i % 2 == 0) {
                fromLeft = sideLength;
            } else {
                fromLeft = (2.5) * sideLength;
            }

            for (int j = 0; j < 7; j++) {
                Polygon hexagon = buildHexagon(fromLeft, fromTop);
                g2.setColor(Color.green);
                g2.drawPolygon(hexagon);
                fromLeft += 3 * sideLength;
            }

            fromTop += 0.865 * sideLength;
        }
    }

    private Polygon buildHexagon(double leftMargin, double topMargin) {
        Polygon hexagon = new Polygon();
        for (int i = 0; i < 6; i++) {
            hexagon.addPoint((int) (leftMargin + sideLength * Math.cos(i * 2 * Math.PI / 6)), (int) (topMargin + sideLength * Math.sin(i * 2 * Math.PI / 6)));
        }
        return hexagon;
    }
}