Java Swing : JPanel will not paint

标签 java swing jpanel paintcomponent repaint

现在,我正在尝试制作一个 Hex Grid GUI,突出显示鼠标悬停在其上的任何十六进制。但是,应该显示六边形的 JPanel 没有出现。

在这种情况下,我真的不知道 repaint() 和 paintComponents() 之间发生了什么。我试图查找解决方案,其中涉及将 JPanel 设置为可见的层次结构,我确定我这样做了,但它仍然无法正常工作。

代码有点长

import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Polygon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;


public class HexGridTester implements ActionListener, MouseListener, MouseMotionListener
{

private JFrame frame;
private TestPanel panel;
private double radius;
private double width;
private double side;
private double height;
private Location mouseover;

private class TestPanel extends JPanel
{
    @Override
    public void paintComponents(Graphics g)
    {
        System.out.println("CALLED");
        super.paintComponents(g);
        int[] xpoints = new int[6];
        int[] ypoints = new int[6];

        for(int c = 0; c < 15; c++)
        {
            for(int r = 0; r < 21; r++)
            {
                int dx = c * (int) width;
                int dy = r * (int) height;

                if(new Location(c, r).equals(mouseover))
                {
                    g.setColor(Color.blue);
                }
                else
                {
                    g.setColor(Color.black);
                }

                if(c % 2 != 0)
                {
                    dy += height / 2;
                }

                for(int i = 0; i < 6; i++)
                {
                    xpoints[i] = (int) ((int) 10 * Math.cos(i * 2 * Math.PI / 6) + dx);
                    ypoints[i] = (int) ((int) 10 * Math.sin(i * 2 * Math.PI / 6) + dy);
                }

                Polygon hex = new Polygon (xpoints, ypoints, 6);
                g.fillPolygon(hex);
                System.out.print("Drawing " + r + "," + c);
            }
        }
    }
}

public HexGridTester(int r)
{
    radius = r;
    side = radius * 3/2;
    width = radius * 2;
    height = Math.sqrt(3) * radius;
    frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new GridLayout(0, 1));
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    panel = new TestPanel();
    panel.setLayout(new GridLayout(0,1));
    panel.addMouseListener(this);
    panel.addMouseMotionListener(this);
    frame.add(panel);
    frame.setContentPane(panel);
    frame.pack();
    frame.setVisible(true);
    panel.repaint();
}

@Override
public void actionPerformed(ActionEvent ae)
{

}

@Override
public void mouseClicked(MouseEvent me)
{

}

@Override
public void mousePressed(MouseEvent me)
{

}

@Override
public void mouseReleased(MouseEvent me)
{

}

@Override
public void mouseEntered(MouseEvent me)
{

}

@Override
public void mouseExited(MouseEvent me)
{

}

@Override
public void mouseDragged(MouseEvent me)
{

}

@Override
public void mouseMoved(MouseEvent me)
{
    //System.out.println(me.getPoint().x + " " +  me.getPoint().y + " " + mouseover);
    mouseover = convert(me.getPoint().x, me.getPoint().y);
    panel.repaint();
}

private Location convert(double x, double y)
{       
    double xt;
    double yt;

    double r;
    double c;

    double rt;
    double ct;

    double dr;

    ct = x / side;
    if(ct % 2 == 0)
    {
        rt = y / height;
    }
    else
    {
        rt =  (y - ( height) / 2) / (height);
    }

    xt = x - ct * side;
    yt = y - rt * height;

    if(yt > (height /2))
    {
        dr = 1;
    }
    else
    {
        dr = 0;
    }

    if(xt > (radius * Math.abs(.5 - yt/height)))
    {
        c = ct;
        r = rt;
    }
    else
    {
        c = ct - 1;
        r = rt - c%2 + dr;
    }
    return new Location((int) c, (int) r);
}

private static void runTestWindow()
{
    HexGridTester tester = new HexGridTester(25);
}

    public static void main(String[] args)
{
    Runnable run = new Runnable()
    {
        @Override
        public void run()
        {
            runTestWindow();
        }
    };

    javax.swing.SwingUtilities.invokeLater(run);
}
}

最佳答案

@Override
public void paintComponents(Graphics g)
{
    System.out.println("CALLED");
    super.paintComponents(g);

应该是:

@Override
public void paintComponent(Graphics g)
{
    System.out.println("CALLED");
    super.paintComponent(g);

尊重油漆链。不要为任何 JComponent 覆盖除 paintComponent(Graphics) 之外的任何方法。

关于Java Swing : JPanel will not paint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23357919/

相关文章:

java - 在 Java 中创建 Vector 类对象

java - 由于 setOpaque(false) 方法,JPanel 不断被重新绘制

java - 如何在BoxLayout中的JButton之间添加垂直空间?

java - JPanel 中的多个组件未显示

java - 读取 USB 数据而不阻塞 UI

java - 通过 servlet 生成动态复选框?

java数据结构替代文件io

java - 在 JTabbedPane 中使用 JTextField 格式化 JPanel

java - 在 Java GUI 中显示 com 端口数据

java - 打印 JTextArea 换页字符作为分页符