изображение формы java gui не показывает диалоговое сообщение, не работает

#java #user-interface

#java #пользовательский интерфейс

Вопрос:

Я хотел бы вставить изображение в свой JFrame , но оно не отображается. Файл изображения «a.jpg «

Это результат, который я получаю

введите описание изображения здесь

Вот мой код.

 import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class myself extends JFrame
{   
    public myself()
    {
        super("Introduction to myself");
        setLayout(new FlowLayout());

        JLabel jl = new JLabel("Name");
        JTextField jtf = new JTextField("random name",20);
        jtf.setEnabled(false);
        jtf.setBackground(Color.gray);
        jl.setVerticalAlignment(SwingConstants.TOP);
        add(jl);
        add(jtf);

        JLabel jl1 = new JLabel("Date of Birth");
        JTextField jtf1 = new JTextField("not today",20);
        jtf1.setEnabled(false);
        jtf1.setBackground(Color.gray);
        jl1.setVerticalAlignment(SwingConstants.CENTER);
        add(jl1);
        add(jtf1);

        JLabel jl2 = new JLabel("Email");
        JTextField jtf2 = new JTextField("thisismyemail@gmail.com",20);
        jtf2.setEnabled(false);
        jtf2.setBackground(Color.gray);
        jl2.setVerticalAlignment(SwingConstants.BOTTOM);
        add(jl2);
        add(jtf2);

        ImageIcon ic = new ImageIcon("a.jpg");
        JLabel jl3 = new JLabel("My comments to the subject, will update further", ic, SwingConstants.LEFT);
        jl3.setToolTipText ("I am rabbit");
        add(jl3);

        JTextField comment1 = new JTextField(20);
        add(comment1);

        JTextField comment2 = new JTextField(20);
        add(comment2);

        comment1.addActionListener(new ActionListener()
        {
            String c1 = comment1.getText();
            String c2 = comment2.getText();
            String s = "1. "   c1   " 2. "   c2;

            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, s, "My suggestion to the course", JOptionPane.WARNING_MESSAGE);
            }
        });

        comment2.addActionListener(new ActionListener()
        {
            String c1 = comment1.getText();
            String c2 = comment2.getText();
            String s = String.format("1. "   c1   " 2. "   c2);

            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, s, "My suggestion to the course", JOptionPane.WARNING_MESSAGE);
            }
        });
    }
}

class Lab3
{
    public static void main (String [ ] args)
    {
        myself ms = new myself();
        ms.setSize(200, 300);
        ms.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ms.setVisible(true);
    }
}
  

Кроме того, помимо проблемы с изображением, я также сталкиваюсь с проблемой с моим ActionListener .
Я хотел бы получить это в качестве вывода, после того как я закончу вводить текстовые поля и нажму ENTER

введите описание изображения здесь

Но это то, что я получаю с кодом, который у меня есть прямо сейчас.

введите описание изображения здесь

Ответ №1:

  1. Измените имя класса myself на Myself в соответствии с соглашениями об именовании Java
  2. Используйте более подходящий менеджер компоновки. GridBagLayout подходит для форм, содержащих JLabel JTextField пары и. См. раздел Размещение компонентов в контейнере
  3. Ваш файл изображения не найден. Согласно вашему коду, он должен находиться в текущем рабочем каталоге, который является значением, возвращаемым этим кодом.
 System.getProperty("user.dir")
  

См. Как использовать значки

  1. Для того, чтобы actionPerformed() метод правильно отображал текст из comment1 и comment2 , вам необходимо получить текст изнутри метода. Обратитесь к вложенным классам
  2. Вызовите метод pack вместо setSize() .
  3. Рассмотрите также возможность вызова метода setLocationByPlatform

Вот моя переработанная версия вашего кода.

 import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class Lab3 {
    public static void main(String[] args) {
        Myself ms = new Myself();
        ms.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ms.pack();
        ms.setLocationByPlatform(true);
        ms.setVisible(true);
    }
}

class Myself extends JFrame {
    public Myself() {
        super("Introduction to myself");
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridx = 0;
        gbc.gridy = 0;
        JLabel jl = new JLabel("Name");
        JTextField jtf = new JTextField("random name", 20);
        jtf.setEnabled(false);
        jtf.setBackground(Color.gray);
        jl.setVerticalAlignment(SwingConstants.TOP);
        add(jl, gbc);
        gbc.gridx = 1;
        add(jtf, gbc);

        gbc.gridx = 0;
        gbc.gridy = 1;
        JLabel jl1 = new JLabel("Date of Birth");
        JTextField jtf1 = new JTextField("not today", 20);
        jtf1.setEnabled(false);
        jtf1.setBackground(Color.gray);
        jl1.setVerticalAlignment(SwingConstants.CENTER);
        add(jl1, gbc);
        gbc.gridx = 1;
        add(jtf1, gbc);

        gbc.gridx = 0;
        gbc.gridy = 2;
        JLabel jl2 = new JLabel("Email");
        JTextField jtf2 = new JTextField("thisismyemail@gmail.com", 20);
        jtf2.setEnabled(false);
        jtf2.setBackground(Color.gray);
        jl2.setVerticalAlignment(SwingConstants.BOTTOM);
        add(jl2, gbc);
        gbc.gridx = 1;
        add(jtf2, gbc);

        gbc.gridx = 0;
        gbc.gridy = 3;
        ImageIcon ic = new ImageIcon("a.jpg");
        JLabel jl3 = new JLabel("My comments to the subject, will update further",
                                ic,
                                SwingConstants.LEFT);
        jl3.setToolTipText("I am rabbit");
        add(jl3, gbc);

        gbc.gridx = 1;
        JTextField comment1 = new JTextField(20);
        add(comment1, gbc);

        gbc.gridy = 4;
        JTextField comment2 = new JTextField(20);
        add(comment2, gbc);

        comment1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                String c1 = comment1.getText();
                String c2 = comment2.getText();
                String s = "1. "   c1   " 2. "   c2;
                JOptionPane.showMessageDialog(Myself.this, s, "My suggestion to the course",
                        JOptionPane.WARNING_MESSAGE);
            }
        });

        comment2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String c1 = comment1.getText();
                String c2 = comment2.getText();
                String s = String.format("1. "   c1   " 2. "   c2);
                JOptionPane.showMessageDialog(Myself.this, s, "My suggestion to the course",
                        JOptionPane.WARNING_MESSAGE);
            }
        });
    }
}
  

И вот как это выглядит, когда я запускаю приведенный выше код.

Запущенное приложение.

Комментарии:

1. Для лучшего пользовательского интерфейса я бы разместил JLabel «Мои комментарии» и следующие два JTextFields в двух столбцах сетки (gbc.gridwidth = 2).