java - JPanel 绘图不工作

标签 java swing jframe jpanel draw

我试图在 JFrame 上绘制一个矩形,并使用填充有 JPanel 的网格布局。但是,矩形是在 JPanel 下绘制的,因此我可以看到 JPanel 相交处的颜色。有没有办法指定将其置于前面之类的事情?

这是我的代码:

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.*;
import javax.swing.*;

public class TestComponentAt extends JPanel {
   private static final int ROW_COUNT = 8;
   private static final int W = 60;
   private static final int H = W;
   private static final Dimension PREF_SIZE = new Dimension(W, H);
   private JFrame frame = new JFrame();

   public TestComponentAt() {
      setLayout(new GridLayout(ROW_COUNT, ROW_COUNT, 1, 1));
      setBackground(Color.black);
      for (int i = 0; i < ROW_COUNT * ROW_COUNT; i++) {
         JPanel panel = new JPanel();
         String name = String.format("[%d, %d]", 
               i / ROW_COUNT, i % ROW_COUNT);
         panel.setName(name);
         if ((i/ROW_COUNT) % 2 == (i%ROW_COUNT) % 2) {
            panel.setBackground(Color.black);
         }
         panel.setPreferredSize(PREF_SIZE);
         int row = i/ROW_COUNT;
         add(panel);
         if (panel.getBackground() == Color.black  &&  (row <= 2 || row >= 5)){
             repaint();
         }
      }
      addMouseListener(new MouseAdapter() {
         @Override
         public void mousePressed(MouseEvent e) {
            JPanel panel = (JPanel) getComponentAt(e.getPoint());
            if (panel == null || panel == TestComponentAt.this) {
               return;
            }
            if (panel != null) {
               panel.removeAll();
               panel.revalidate();
               panel.repaint();
            }
            panel.add(new JLabel(panel.getName()));
            panel.revalidate();
            panel.repaint();
         }
      });
   }
   public void paintComponent(Graphics g){
        System.out.println("this has been called");
        super.paintComponent(g);
        g.setColor(Color.pink);
        g.fillOval(100, 100, 100, 100);
   }
   private void createAndShowGui() {
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(480, 480);
      frame.getContentPane().add(new TestComponentAt());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
       TestComponentAt obj = new TestComponentAt();
       obj.createAndShowGui();
   }
}

最佳答案

JLayer 可用于在 JPanel 及其组件上绘制。例如:

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.*;

import javax.swing.*;
import javax.swing.plaf.LayerUI;

public class TestComponentAt extends JPanel {
    private static final int ROW_COUNT = 8;
    private static final int W = 60;
    private static final int H = W;
    private static final Dimension PREF_SIZE = new Dimension(W, H);
    private static final Color TRANSLUCENT_PINK = new Color(255, 175, 175, 200);

    private JFrame frame = new JFrame();

    public TestComponentAt() {
        setLayout(new GridLayout(ROW_COUNT, ROW_COUNT, 1, 1));
        setBackground(Color.black);
        for (int i = 0; i < ROW_COUNT * ROW_COUNT; i++) {
            JPanel panel = new JPanel();
            String name = String.format("[%d, %d]", i / ROW_COUNT, i % ROW_COUNT);
            panel.setName(name);
            if ((i / ROW_COUNT) % 2 == (i % ROW_COUNT) % 2) {
                panel.setBackground(Color.black);
            }
            panel.setPreferredSize(PREF_SIZE);
            int row = i / ROW_COUNT;
            add(panel);
            if (panel.getBackground() == Color.black && (row <= 2 || row >= 5)) {
                frame.repaint();
            }
        }
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                JPanel panel = (JPanel) getComponentAt(e.getPoint());
                if (panel == null || panel == TestComponentAt.this) {
                    return;
                }
                if (panel != null) {
                    panel.removeAll();
                    panel.revalidate();
                    panel.repaint();
                }
                panel.add(new JLabel(panel.getName()));
                panel.revalidate();
                panel.repaint();
            }
        });

    }

    private class MyLayer extends LayerUI<JComponent> {
        @Override
        public void paint(Graphics g, JComponent c) {
            super.paint(g, c);
            g.setColor(TRANSLUCENT_PINK);
            g.fillOval(100, 100, 100, 100);
        }
    }

    private void createAndShowGui() {
        TestComponentAt testComponentAt = new TestComponentAt();
        JLayer<JComponent> myLayer = new JLayer<JComponent>(testComponentAt, new MyLayer());

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(480, 480);
        frame.getContentPane().add(myLayer);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        TestComponentAt obj = new TestComponentAt();
        obj.createAndShowGui();
    }
}

关于java - JPanel 绘图不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40066543/

相关文章:

java - 如何检查数组中的确切元素是否包含在 ArrayList 中存储的数组中?

java - 正则表达式从字符串中捕获 float (并替换为捕获的 float )

java - 井字棋游戏项目图像图标?

java - JOptionPane.showInputDialog自动退出

java - 按下被调用 JFrame 布局类的默认取消图标 [x] 时,调用布局类也会被取消

java - 如何在 Spring 应用程序中运行 JFrame?

Java GUI编程关闭当前Frame

java - 如何在 JTable 中应用更改?

java - 有没有办法使用 Java 和 JDBC 监听 Microsoft SQL 数据库表中的更改?

java - 如何删除 Java Swing 中的行?