Почему я не вижу, как JComponent добавляется в JFrame? - PullRequest
0 голосов
/ 02 ноября 2019

Этот образец добавляет JButton и JLabel к JFrame.

Существует также JComponent, который должен показывать координаты XY курсора.

Я знаю, что есть примеры, показывающие, как показать координаты XY, но мне любопытно узнать, почему это терпит неудачу в этом сценарии.

Глядя на вывод, кажется, что все необходимые слушателизапускаются, поскольку вывод даже показывает, что paintCompoent () выполняется с ожидаемым выводом.

Не уверен, требуется ли это, но я попытался установить setVisible (true), а также setBounds ().

Что препятствует появлению JComponent с координатами XY.

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class XYCoordinateTest extends JFrame 
{

  JLabel label = new JLabel("My Test Label");
  JButton b1 = new JButton("Press Me");
  XYMouseLabel xy = new XYMouseLabel();

  class XYMouseLabel extends JComponent
  {
       public int x;
       public int y;

       public XYMouseLabel() 
       {
         this.setBackground(Color.BLUE);
       }

       // use the xy coordinates to update the mouse cursor text/label
       protected void paintComponent(Graphics g)
       {
         super.paintComponent(g);
         String s = x + ", " + y;
         System.out.println("paintComponent() : " + s);
         g.setColor(Color.red);
         g.drawString(s, x, y);
       }
  } 

  public XYCoordinateTest () 
  {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    getContentPane().setLayout(new FlowLayout());
    getContentPane().add(label);
    getContentPane().add(b1);
    xy.setBounds(0, 0,  300, 100);
    xy.setVisible(true);
    getContentPane().add(xy);

    addMouseMotionListener(new MouseMotionAdapter() {
        public void mouseMoved(MouseEvent me)
        {
         System.out.println("Panel Mouse Move x : " + me.getX() + "   Y : " + me.getY());
          xy.x = me.getX();
          xy.y = me.getY();
          xy.repaint();
        }
      });
    pack();
    setSize(300, 100);
  }

  public static void main(String[] args) {
    new XYCoordinateTest().setVisible(true);
  }
}

1 Ответ

0 голосов
/ 02 ноября 2019

Компонент xy не имеет предпочтительного размера. Вы вызываете pack на JFrame, который устанавливает размеры компонентов в соответствии с их предпочтительными размерами. Поскольку у компонента xy его нет, он становится невидимым.

...