JLabel不在JPanel上显示

问题描述 投票:0回答:2

我已经查了这个问题,发现了几个线程。尝试了所有解决方案,但没有一个有帮助。我试图显示一个放置鼠标的十字形,应该将当前鼠标位置的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);
}
java swing jpanel jlabel paint
2个回答
0
投票

将repaint()放在main方法的底部。重新绘制会调用您拥有的Paint方法,但我认为您还必须添加自己的替代重绘方法才能停止“闪烁”。


0
投票

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

为了正确显示2个标签,您需要添加this.setLayout(new FlowLayout(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);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.