Какой компонент Swing использовать? - PullRequest
0 голосов
/ 11 сентября 2018

Я новичок в программировании на Java и GUI.У меня следующий вопрос.

В моем графическом интерфейсе у меня есть JTextField с JLabel, который читает «Радиус».Теперь я хочу поместить значок рядом с JTextField с вопросительным знаком, который при щелчке подробно объясняет, что означает JLabel.Например, в этом случае должно появиться сообщение, поясняющее «Радиус круга, который будет нарисован на изображении».Сообщение должно исчезнуть при перемещении мыши. Ниже приведено графическое описание того, что я пытаюсь реализовать.

Мой вопрос очень простой.Я хочу знать, какой компонент Swing я могу использовать для реализации этого?Я пытался найти его в Интернете, но я не знал, какой компонент искать.Любая помощь и предложения будут оценены.enter image description here

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Интересно, почему никто не предложил использовать для этого Popup.

Это в основном то, что используется "под капотом" подсказок (и всплывающих меню). Основным преимуществом здесь является то, что вы не позаботились о макете и (в отличие от стандартных подсказок) имеете полный контроль над тем, когда он появляется и когда он исчезает. Таким образом, вы можете явно создать всплывающее окно при нажатии на значок и явно скрыть его при выходе мыши из значка:

Popup Example

Вот код как MCVE :

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Popup;
import javax.swing.PopupFactory;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class PopupExample
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private static void createAndShowGui()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel p = new JPanel(new BorderLayout());
        p.add(new JLabel("Radius:"), BorderLayout.WEST);
        p.add(new JTextField(10), BorderLayout.CENTER);

        Icon icon = UIManager.getIcon("OptionPane.questionIcon");
        JLabel label = new JLabel(icon);

        addHelpPopup(label, "<html>"
            + "The help text. You can (but do <br>"
            + "not have to) use <i>HTML</i> here for <br>"
            + "<u>formatting</u>"
            + "</html>");

        p.add(label, BorderLayout.EAST);

        f.getContentPane().setLayout(new FlowLayout());
        f.getContentPane().add(p);

        f.add(label);
        f.setSize(400, 300);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }


    private static void addHelpPopup(Component component, String text)
    {
        component.addMouseListener(new MouseAdapter()
        {
            private Popup popup;

            @Override
            public void mouseClicked(MouseEvent e)
            {
                if (popup != null)
                {
                    popup.hide();
                    popup = null;
                }
                PopupFactory popupFactory = PopupFactory.getSharedInstance();
                JLabel label = new JLabel(text);
                label.setOpaque(true);
                label.setBorder(BorderFactory.createCompoundBorder(
                    BorderFactory.createLineBorder(Color.BLACK),
                    BorderFactory.createEmptyBorder(5, 5, 5, 5)));
                Dimension dim = label.getPreferredSize();
                Point p = e.getLocationOnScreen();
                popup = popupFactory.getPopup(
                    component, label, p.x, p.y - dim.height);
                popup.show();
            }
            @Override
            public void mouseExited(MouseEvent e)
            {
                if (popup != null)
                {
                    popup.hide();
                    popup = null;
                }
            }
        });

    }

}
0 голосов
/ 11 сентября 2018

Вы можете сделать это очень легко.Все, что вам нужно сделать, это просто использовать JLabel и не размещать на нем текст.Вместо этого поместите на него изображение

Этот код позволяет вам установить для изображения JLabel

import java.awt.FlowLayout;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class AddingIconJLabel {
  public static void main(String[] args) {
    JFrame.setDefaultLookAndFeelDecorated(true);
    JFrame frame = new JFrame();
    frame.setTitle("JLabel Test");
    frame.setLayout(new FlowLayout());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    ImageIcon imageIcon = new ImageIcon("yourFile.gif");
    JLabel label = new JLabel(imageIcon);

    frame.add(label);
    frame.pack();
    frame.setVisible(true);
  }
}

Во-вторых, поместите подсказку ToolTip на JLabel, чтобы сделать текстпоявляются на изображении

Вот полезный совет для этого

JLabel label = new JLabel("Username");
label.setToolTipText("Enter your username");
...