JLabel не отображается на JPanel - PullRequest
0 голосов
/ 14 февраля 2019

Я уже посмотрел эту проблему и нашел несколько тем.Перепробовал все решения и ни одно из них не помогло.Я пытаюсь показать крестик, где находится моя мышь, координаты x и y моей текущей позиции мыши должны отображаться в верхнем левом и правом верхнем углу.Чтобы добиться этого, я использовал два JLabels.Может быть, я что-то пропускаю?

Я играл со стандартным текстом, который я установил в метках, позиционированием, различными макетами для моей рамки и панели - ничего не помогает.Следующий код должен быть достаточно хорош для понимания, я не думаю, что было бы полезно, если бы я что-то упустил.

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);
}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Поместите repaint () внизу вашего основного метода.Repaint вызывает метод Paint, который у вас есть, но я думаю, что вам также нужно добавить собственный переопределяющий метод repaint, чтобы перестать «мерцать».

0 голосов
/ 14 февраля 2019

Вы переопределяете метод paint().Итак, вам нужно добавить super.paint(g); в качестве первой строки в вашем переопределенном методе paint().

Чтобы правильно отобразить 2 метки, вам нужно добавить this.setLayout(new FlowLayout(FlowLayout.LEFT)); строку.

I 'm добавив полный код с указанными выше изменениями, чтобы вы могли запустить его и увидеть результаты самостоятельно.

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);
  }
}
...