Java JLabel不显示在JPanel上

Java JLabel不显示在JPanel上,java,swing,jpanel,jlabel,paint,Java,Swing,Jpanel,Jlabel,Paint,我已经查找了这个问题,发现了几个线程。尝试了所有的解决方案,但没有一个有效。我试图在鼠标所在的位置显示一个十字,我当前鼠标位置的x和y坐标应该显示在左上角和右上角。为了实现这一点,我使用了两个jlabel。 也许我忽略了什么 我在标签、定位、框架和面板的不同布局中设置了标准文本,但没有任何帮助。 下面的代码应该足够好来理解,我不认为如果我遗漏了什么会有帮助 Fensterkreuz(){ jl1 = new JLabel("0"); jl2 = new JLabel("0");

我已经查找了这个问题,发现了几个线程。尝试了所有的解决方案,但没有一个有效。我试图在鼠标所在的位置显示一个十字,我当前鼠标位置的x和y坐标应该显示在左上角和右上角。为了实现这一点,我使用了两个jlabel。 也许我忽略了什么

我在标签、定位、框架和面板的不同布局中设置了标准文本,但没有任何帮助。 下面的代码应该足够好来理解,我不认为如果我遗漏了什么会有帮助

Fensterkreuz(){
    jl1 = new JLabel("0");
    jl2 = new JLabel("0");
    jl1.setSize(new Dimension(100,100));
    jl2.setSize(new Dimension(100,100));
    jl1.setFont(new Font ("Arial", Font.PLAIN, 15));
    jl2.setFont(new Font ("Arial", Font.PLAIN, 15));
    cP = new Point();
    this.add(jl1);
    this.add(jl2);
    addMouseMotionListener(this);       
    }

public void mouseDragged (MouseEvent e){
}
public void mouseMoved (MouseEvent e) {
    cP = e.getPoint();
    repaint();
}
public void paint (Graphics g){
    g.drawLine((cP.x),(cP.y-15), (cP.x),(cP.y+15));
    g.drawLine((cP.x-15),(cP.y), (cP.x+15),(cP.y));
    jl1.setText(String.valueOf(cP.x));
    jl2.setText(String.valueOf(cP.y));
}

public static void main (String [] args) {
    JFrame f = new JFrame();
    JComponent test = new Fensterkreuz();
    test.setOpaque(false);
    f.setVisible(true);
    f.setSize(1500,1000);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setContentPane(test);
}

您正在重写
paint()
方法。因此,您需要添加
super.paint(g)
作为重写的
paint()
方法中的第一行

要正确显示这两个标签,需要添加
this.setLayout(newflowlayout(FlowLayout.LEFT))

我在这里添加了带有上述更改的完整代码,以便您可以自己运行并查看结果

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

public class Fensterkreuz extends JComponent implements MouseMotionListener {

  private JLabel jl1;
  private JLabel jl2;
  private Point cP;

  Fensterkreuz(){
    jl1 = new JLabel("0");
    jl2 = new JLabel("0");
    jl1.setSize(new Dimension(100,100));
    jl2.setSize(new Dimension(100,100));
    jl1.setFont(new Font ("Arial", Font.PLAIN, 15));
    jl2.setFont(new Font ("Arial", Font.PLAIN, 15));
    cP = new Point();

    //this.setLayout(new FlowLayout(FlowLayout.LEFT));
    //this.add(jl1);
    //this.add(jl2);

    this.setLayout(new GridBagLayout());
    this.add(jl1, new GridBagConstraints(0, 0, 1, 1, 0.0, 1.0, GridBagConstraints.NORTHWEST,
        GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
    this.add(jl2, new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0, GridBagConstraints.NORTHEAST,
        GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));

    addMouseMotionListener(this);
  }

  public void mouseDragged (MouseEvent e){
  }
  public void mouseMoved (MouseEvent e) {
    cP = e.getPoint();
    repaint();
  }
  public void paint (Graphics g){
    super.paint(g);
    g.drawLine((cP.x),(cP.y-15), (cP.x),(cP.y+15));
    g.drawLine((cP.x-15),(cP.y), (cP.x+15),(cP.y));
    jl1.setText(String.valueOf(cP.x));
    jl2.setText(String.valueOf(cP.y));
  }

  public static void main (String [] args) {
    JFrame f = new JFrame();
    JComponent test = new Fensterkreuz();
    test.setOpaque(false);
    f.setVisible(true);
    f.setSize(1500,1000);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setContentPane(test);
  }
}

将repaint()放在主方法的底部。Repaint调用您拥有的Paint方法,但我认为您还必须添加自己的重写Repaint方法以停止“闪烁”。

您是否尝试将
setVisible()
作为最后一步?在何处将标签添加到框架中?您好,这在面板上显示我的标签时起作用。我不明白为什么我需要调用super-in-paint方法,如果不调用super,无论设置的布局如何,它都不会显示标签。另外,我希望一个标签显示在左上角,另一个显示在右上角,我尝试了“设置水平对齐(SwingConstants.left)”并相应地显示在右上角,但不起作用。@SahilSingh,您可以使用
GridBagLayout
(我已经编辑了使用此布局管理器的答案。请试用。)。当我们重写
paint()
方法时,有必要调用
super.paint()
,因为
JComponent.paint()
实现了所有组件的核心绘制机制。