Java Gridbag布局填充多边形不显示?

Java Gridbag布局填充多边形不显示?,java,swing,graphics,jframe,paintcomponent,Java,Swing,Graphics,Jframe,Paintcomponent,为什么我告诉我的程序要显示多边形。这是我调用的类的代码 package rubiksCube; /*class that contains my paint component*/ import java.awt.*; import javax.swing.JPanel; public class Display extends JPanel{ Polygon[][] p = {{new Polygon(),new Polygon(),new Polygon()},

为什么我告诉我的程序要显示多边形。这是我调用的类的代码

package rubiksCube;
/*class that contains my paint component*/
import java.awt.*;
import javax.swing.JPanel;
public class Display extends JPanel{
    Polygon[][] p = {{new Polygon(),new Polygon(),new Polygon()},
                    {new Polygon(),new Polygon(),new Polygon()},
                    {new Polygon(),new Polygon(),new Polygon()}};
    int[] rx = {0,0,0,0};
    int[] ry = {0,0,0,0};
    int rsN = 0;
    public void renderSide(int sN,int[] x,int[] y){
        rsN = sN;
        ry = y;
        rx = x;
    }
    public void paintComponent(Graphics g){
        g.clearRect(0, 0, 100, 100);
        for(int y = 0;y<3;y++){
            for(int x = 0;x<3;x++){
                System.out.print(x);
                System.out.println(y);
                g.setColor(getColor(Main.j[rsN][(y*3)+x]));
                p[y][x].addPoint((((rx[0]-rx[3])*(y/3)+rx[0])-((rx[1]-rx[2]))*(y/3)+rx[1])*(x/3)+((rx[0]-rx[3])*(y/3)+rx[0]),((((ry[0]-ry[3])*(x/3)+ry[0])-((ry[1]-ry[2]))*(x/3)+ry[1]))*(y/3)+((ry[0]-ry[3])*(x/3)+ry[0]));
                p[y][x].addPoint((((rx[0]-rx[3])*(y/3)+rx[0])-((rx[1]-rx[2]))*(y/3)+rx[1])*(x+1/3)+((rx[0]-rx[3])*(y/3)+rx[0]),((((ry[0]-ry[3])*(x/3)+ry[0])-((ry[1]-ry[2]))*(x/3)+ry[1])*(y/3))+((ry[0]-ry[3])*(x/3)+ry[0]));
                p[y][x].addPoint((((rx[0]-rx[3])*(y/3)+rx[0])-((rx[1]-rx[2]))*(y/3)+rx[1])*(x+1/3)+((rx[0]-rx[3])*(y/3)+rx[0]),((((ry[0]-ry[3])*(x/3)+ry[0])-((ry[1]-ry[2]))*(x/3)+ry[1]))*(y+1/3)+((ry[0]-ry[3])*(x/3)+ry[0]));
                p[y][x].addPoint((((rx[0]-rx[3])*(y/3)+rx[0])-((rx[1]-rx[2]))*(y/3)+rx[1])*(x/3)+((rx[0]-rx[3])*(y/3)+rx[0]),((((ry[0]-ry[3])*(x/3)+ry[0])-((ry[1]-ry[2]))*(x/3)+ry[1]))*(y+1/3)+((ry[0]-ry[3])*(x/3)+ry[0]));
                g.fillPolygon(p[y][x]);
            }
        }
    }
    public Color getColor(int i){
        switch(i){
            case 0:
            return Color.WHITE;
            case 1:
            return Color.GREEN;
            case 2:
            return Color.RED;
            case 3:
            return Color.YELLOW;
            case 4:
            return Color.BLUE;

        }
        return Color.ORANGE;
    }
}
//my main class
package rubiksCube;

import java.awt.Graphics;

import javax.swing.JFrame;

public class Main {

    public static int[][] j = {
            {0,0,0,0,0,0,0,0,0},
            {1,1,1,1,1,1,1,1,1},
            {2,2,2,2,2,2,2,2,2},
            {3,3,3,3,3,3,3,3,3},
            {4,4,4,4,4,4,4,4,4},
            {5,5,5,5,5,5,5,5,5}
    };
    public static void main(String args[]){
            SimpleGui s = new SimpleGui();
            Display d = new Display();
            int[] x = {0,100,100,0};
            int[] y = {0,0,100,100};
            d.renderSide(0,x,y);
            s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            s.pack();
            s.setSize(1000,700);
            s.setVisible(true);
            s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            s.pack();
            s.setSize(1000,1000);
            s.setVisible(true);

    }

}
    //and my gui class
package rubiksCube;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;


public class SimpleGui  extends JFrame{
        int[] px2;
        int[] py2;
        int[] pz2;
        Graphics g2 = null;
        int sN;


    public SimpleGui(){
        JButton solve = new JButton();
        JPanel p = new JPanel();
        solve.setText("Solve");
        solve.addActionListener(new ActionListener(){

        public void actionPerformed(ActionEvent e){
            Control c = new Control();
            c.solve();
        }});
        solve.addKeyListener(new KeyListener(){


            public void keyPressed(KeyEvent k) {
                switch (k.getKeyCode()){
                case KeyEvent.VK_DOWN:

                    break;
                case KeyEvent.VK_UP:

                    break;
                case KeyEvent.VK_LEFT:

                    break;
                case KeyEvent.VK_RIGHT:

                    break;
                case KeyEvent.VK_0:

                    break;
                case KeyEvent.VK_1:

                    break;
                case KeyEvent.VK_2:

                    break;
                case KeyEvent.VK_3:

                    break;
                case KeyEvent.VK_4:

                    break;
                case KeyEvent.VK_5:

                    break;
                case KeyEvent.VK_6:

                    break;
                case KeyEvent.VK_7:

                    break;
                case KeyEvent.VK_8:

                    break;
                case KeyEvent.VK_9:

                    break;
                case KeyEvent.VK_MINUS:

                    break;
                case KeyEvent.VK_EQUALS:

                    break;

                }


            }


            public void keyReleased(KeyEvent k) {


            }


            public void keyTyped(KeyEvent k) {


            }

        });
        JButton random = new JButton();
        random.setText("Randomize");
        random.addActionListener(new ActionListener(){

        public void actionPerformed(ActionEvent e){
            Control c = new Control();
            c.random();
        }});
        p.setVisible(true);
        p.setLayout(new GridBagLayout());
        solve.setVisible(true);
        random.setVisible(true);
        GridBagConstraints c = new GridBagConstraints();
        c.weightx = 1;
        c.weighty = 1;
        c.gridx = 0;
        c.gridy = 0;
        c.anchor = GridBagConstraints.FIRST_LINE_START;
        p.add(solve,c);
        c.anchor = GridBagConstraints.PAGE_START;
        c.gridx = 0;
        c.gridy = 0;
        p.add(random,c);
        c.anchor = GridBagConstraints.FIRST_LINE_START;
        c.gridx = 2;
        c.gridy = 2;
        JPanel d = new Display();
        d.setPreferredSize(new Dimension(100,100));
        p.add(d,c);
        add(p);
        setContentPane(p);
        setVisible(true);
    }}
rubikskube包装;
/*类,该类包含我的绘制组件*/
导入java.awt.*;
导入javax.swing.JPanel;
公共类显示扩展了JPanel{
多边形[][]p={{{新多边形(),新多边形(),新多边形()},
{新多边形(),新多边形(),新多边形()},
{新多边形(),新多边形(),新多边形()};
int[]rx={0,0,0};
int[]ry={0,0,0,0};
int rsN=0;
公共void renderSide(int序列号,int[]x,int[]y){
rsN=sN;
y=y;
rx=x;
}
公共组件(图形g){
g、 clearRect(0,0,100,100);
对于(int y=0;y
  • 不调用super.paintComponent将导致潜在问题
  • 不为
    显示提供大小提示
    可能会将其呈现为
    0x0
  • 绘制图形时的位置与已绘制的组件相关,即
    0x0
    的x/y位置是组件的左上角,指定可能超出组件大小的x/y位置将不会绘制
  • 以下是

    public static void main(String args[]) {
        SimpleGui s = new SimpleGui();
        Display d = new Display();
        int[] x = {0, 100, 100, 0};
        int[] y = {0, 0, 100, 100};
        d.renderSide(0, x, y);
        s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        s.setSize(1000, 700);
        s.setVisible(true);
    }
    
    有点徒劳无益,因为
    d
    实际上并没有添加到任何可以渲染它的内容中

    已更新

    您需要进一步调试代码

    我添加了一些
    System.out.println
    语句来查看您正在创建什么,这是输出

    --nxn
    是循环的主
    。它后面的每一系列数字都是多边形

    ---0x0
    0x0
    0x0
    0x0
    0x0
    ---1x0
    0x0
    100x0
    100x0
    0x0
    ---2x0
    0x0
    200x0
    200x0
    0x0
    ---0x1
    0x0
    0x0
    0x0
    0x0
    ---1x1
    0x0
    100x0
    100x0
    0x0
    ---2x1
    0x0
    200x0
    200x0
    0x0
    ---0x2
    0x0
    0x0
    0x0
    0x0
    ---1x2
    0x0
    100x0
    100x0
    0x0
    ---2x2
    0x0
    200x0
    200x0
    0x0
    ---0x0
    0x0
    0x0
    0x0
    0x0
    ---1x0
    0x0
    100x0
    100x0
    0x0
    ---2x0
    0x0
    200x0
    200x0
    0x0
    ---0x1
    0x0
    0x0
    0x0
    0x0
    ---1x1
    0x0
    100x0
    100x0
    0x0
    ---2x1
    0x0
    200x0
    200x0
    0x0
    ---0x2
    0x0
    0x0
    0x0
    0x0
    ---1x2
    0x0
    100x0
    100x0
    0x0
    ---2x2
    0x0
    200x0
    200x0
    0x0
    
    如果仔细观察,您将看到您正在绘制直线(或空多边形)


    另外,您在
    Display
    中声明和使用
    p
    的方式也值得关注,因为您从不重置
    多边形,这意味着,每次重新绘制时,您只需向多边形添加更多点。最好先对此进行预处理,然后简单地绘制结果-IMHO

    抱歉,我无法回答,但感谢您提供的所有建议。我现在看到你对空多边形的看法是正确的。现在解决这个问题。还有一个问题,当rx[1]在任何其他类中调用时,它似乎总是等于0,而不是在渲染端。这是为什么?