#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:
- Измените имя класса
myself
наMyself
в соответствии с соглашениями об именовании Java - Используйте более подходящий менеджер компоновки.
GridBagLayout
подходит для форм, содержащихJLabel
JTextField
пары и. См. раздел Размещение компонентов в контейнере - Ваш файл изображения не найден. Согласно вашему коду, он должен находиться в текущем рабочем каталоге, который является значением, возвращаемым этим кодом.
System.getProperty("user.dir")
- Для того, чтобы
actionPerformed()
метод правильно отображал текст изcomment1
иcomment2
, вам необходимо получить текст изнутри метода. Обратитесь к вложенным классам - Вызовите метод pack вместо
setSize()
. - Рассмотрите также возможность вызова метода 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).