【问题标题】:JLabel doesnt show on JPanelJLabel 不显示在 JPanel 上
【发布时间】:2019-07-08 09:05:57
【问题描述】:

我已经查找了这个问题,并找到了几个线程。尝试了所有解决方案,但没有一个有帮助。我试图在放置鼠标的位置显示一个十字,我当前鼠标位置的 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);
}

【问题讨论】:

  • 您是否尝试过setVisible() 作为最后一步?
  • 您将标签添加到框架的什么位置?

标签: java swing jpanel jlabel paint


【解决方案1】:

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

要正确显示 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);
  }
}

【讨论】:

  • 嗨,这可以在面板上显示我的标签。我不明白为什么我需要在paint方法中调用super,如果不调用super,无论设置布局如何,它都不会显示标签。另外,我希望一个标签显示在左上角,另一个标签显示在右上角,我尝试了“setHorizo​​ntalAlignment(SwingConstants.LEFT)”,因此右,但它不起作用。
  • @SahilSingh,您可以使用GridBagLayout 实现这种左上角+右上角的布局(我已经编辑了使用此布局管理器的答案。试试看。)。当我们重写paint()方法时,需要调用super.paint(),因为JComponent.paint()实现了所有组件的核心绘制机制。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多