如何绘制JLabel?-JAVA

如何绘制JLabel?-JAVA,java,class,drawing,jlabel,graphics2d,Java,Class,Drawing,Jlabel,Graphics2d,我想在“公共虚空绘制(图形g){}”中绘制一个JLabel,以及所有这些东西。如何从类外部(在main方法中)获取一个JLabel并在paint方法中绘制它 static JLabel drawThisOut = new JLabel("draw this out"); public static void main(String[] args) { class paintJLabel extends JComponent { public void paint(Gra

我想在“公共虚空绘制(图形g){}”中绘制一个JLabel,以及所有这些东西。如何从类外部(在main方法中)获取一个JLabel并在paint方法中绘制它

static JLabel drawThisOut = new JLabel("draw this out");
public static void main(String[] args) {
    class paintJLabel extends JComponent {
         public void paint(Graphics g) {
             //what goes here to draw the JLabel?????
         }
    }
}
不,我不能用常规的JLabel来代替它。我需要在JLabel上画一些其他东西,我认为这是最有效的方法。(有没有更有效的方法?)如果有任何帮助,我们将不胜感激。请具体说明。谢谢

在“最简单”的术语中,您可以使用某种类型的
边框,下面给出了一个自定义的圆形边框,但概念相对简单

您还可以使用自定义组件。这为您提供了额外的好处,您可以使用自己的背景色“填充”形状,但在其他方面,本质上是相同的

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.AbstractBorder;
import javax.swing.border.EmptyBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            JLabel label = new JLabel("This is a test");
            label.setBorder(new EmptyBorder(10, 10, 10, 10));
            RoundedPane pane = new RoundedPane();
            pane.add(label);
            add(pane);
        }

    }

    public class RoundedPane extends JPanel {

        public RoundedPane() {
            setLayout(new BorderLayout());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
            g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
            g2d.setColor(Color.BLACK);
            g2d.draw(new RoundRectangle2D.Double(0, 0, getWidth() - 1, getHeight() - 1, 20, 20));
            g2d.dispose();
        }

    }
}

“我需要在JLabel上画一些其他的东西我需要在JLabel上画一些其他的东西”我可以想出很多方法来画标签,但哪种方法可能有用取决于你在做什么-而且,我不确定“画出”是什么表示在此上下文中,
JLabel
支持显示
图标
文本
。您可以使用
GridBagLayout
Border
s来处理偏移和定位问题。您可以使用
JLayeredPane
和/或
glassPane
甚至
JLayer
不可以-请原谅,我不想把我或您的时间浪费在一些不清楚的事情上。您是否可以花5分钟来更好地解释您试图实现的目标-这将缩小可用解决方案的范围-不,将所有这些选项的示例放在一起可能需要5分钟以上的时间,因为您没有解释您的首要问题,所以这些选项可能无法满足您的需求。拜托,我已经这样做了4年多,花了很多时间帮助别人,我很想帮助你,但你首先需要帮助我。这个问题在目前的状态下已经不清楚了。你可能想删除一些你的评论,因为其中一些不合适,甚至是非常粗鲁(说咬一只会喂饱你的手!)。非常感谢。对不起,如果我早些时候粗鲁地回答。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.AbstractBorder;
import javax.swing.border.EmptyBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            JLabel label = new JLabel("This is a test");
            label.setBorder(new EmptyBorder(10, 10, 10, 10));
            RoundedPane pane = new RoundedPane();
            pane.add(label);
            add(pane);
        }

    }

    public class RoundedPane extends JPanel {

        public RoundedPane() {
            setLayout(new BorderLayout());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
            g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
            g2d.setColor(Color.BLACK);
            g2d.draw(new RoundRectangle2D.Double(0, 0, getWidth() - 1, getHeight() - 1, 20, 20));
            g2d.dispose();
        }

    }
}