java - GridBagLayout 会影响 JLabel 图像吗?

标签 java swing jlabel imageicon

当前正在尝试将标题图像添加到基于 JFrame 的 GUI,我已经开发了项目的布局,一切看起来都不错,但每次运行项目时图像都不会加载(没有错误消息)。

我的代码(部分):

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;


public class DeltaFlightFrame extends JFrame implements ActionListener, ChangeListener{
    //<SNIPPED CODE FOR EASE OF VIEWING>



    //Labels for inputs
    //<SNIPPED CODE FOR EASE OF VIEWING>
    private JLabel deltaLogo;

    //icon
    private Icon logo;

   //<SNIPPED CODE FOR EASE OF VIEWING>


    DeltaFlightFrame() {
        GridBagConstraints layoutConst = null;


        //<SNIPPED CODE FOR EASE OF VIEWING>

        setTitle("Delta Flight Price Estimator");

        //<SNIPPED CODE FOR EASE OF VIEWING>

        //initialize delta logo
        logo = new ImageIcon("../img/logo.png");
        deltaLogo = new JLabel(logo);

        System.out.println("Height" + logo.getIconHeight());
        System.out.println("Width" + logo.getIconWidth());

        //<SNIPPED CODE FOR EASE OF VIEWING>

        // Create frame and add components using GridBagLayout
        setLayout(new GridBagLayout());
        layoutConst = new GridBagConstraints();
        layoutConst.insets = new Insets(10, 10, 1, 1);
        //layoutConst.anchor = GridBagConstraints.LINE_START;
        layoutConst.gridx = 0;
        layoutConst.gridy = 0;
        //layoutConst.gridwidth = 4;
        add(deltaLogo, layoutConst);

        //<SNIPPED CODE FOR EASE OF VIEWING>
    }




    //TODO: this
    public void stateChanged(ChangeEvent event) {
    }

    //TODO, also: this
    public void actionPerformed(ActionEvent event) {

    }


    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch(Exception ignored){}
        DeltaFlightFrame myFrame = new DeltaFlightFrame();

        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myFrame.pack();
        myFrame.setVisible(true);

    }
}

我的完整代码(我不想把它全部写出来,这是一团糟,我是一年级学生,所以这不是......很好......哈哈哈):

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;


public class DeltaFlightFrame extends JFrame implements ActionListener, ChangeListener{
    //Text Fields
    private JTextField desCityField;  // Holds destination city abbreviation,
    private JTextField depCityField;  // Holds departure city abbreviation.
    private JTextField finalOutputField; //Shows final price

    //Drop Down
    //=====TODO

    //Labels for inputs
    private JLabel desCityLabel;
    private JLabel depCityLabel;
    private JLabel tripTypeLabel;
    private JLabel seatTypeLabel;
    private JLabel adultTravelerCountLabel;
    private JLabel childTravelerCountLabel;
    private JLabel finalOutput; //final price
    private JLabel flightTitle;
    private JLabel passengerTitle;
    private JLabel deltaLogo;

    //icon
    private Icon logo;

    //dropdown
    String[] seatClassChoices = { "Basic Economy", "Business+ Comfort", "First Class" };
    private JComboBox seatClassDrop;

    //JSpinners
    private JSpinner adultTravelerCount;
    private JSpinner childTravelerCount;

    //radio button
    private JRadioButton oneWay;
    private JRadioButton roundTrip;

    //Buttons
    private JButton calculateButton;



    /* Constructor creates GUI components and adds GUI components
      using a GridBagLayout. */

    DeltaFlightFrame() {
        GridBagConstraints layoutConst = null;
        SpinnerNumberModel spinnerModelAdult = null;
        SpinnerNumberModel spinnerModelChild = null;


        String desInit = "ATL";
        String depInit = "JFK";
        double priceInit = 150.00;

        int passCountMin = 0;
        int passCountMax = 9;
        int passAdultInit = 1;
        int passChildInit = 0;



        //Set Frame Title
        setTitle("Delta Flight Price Estimator");

        //create labels
        depCityLabel = new JLabel("Departure City: ");
        desCityLabel = new JLabel("Destination City: ");
        tripTypeLabel = new JLabel("Trip Type: ");
        seatTypeLabel = new JLabel("Seat Class: ");
        adultTravelerCountLabel = new JLabel("Travelling Adults: ");
        childTravelerCountLabel = new JLabel("Travelling Children: ");
        finalOutput = new JLabel("Price: ");


        flightTitle = new JLabel("Flight Information");
        flightTitle.setFont(new Font("Sans-Serif", Font.BOLD, 20));

        passengerTitle = new JLabel("Passenger Information");
        passengerTitle.setFont(new Font("Sans-Serif", Font.BOLD, 20));


        //create dropdown
        seatClassDrop = new JComboBox<String>(seatClassChoices);

        //create spinners
        spinnerModelAdult = new SpinnerNumberModel(passAdultInit, passCountMin, passCountMax, 1);
        adultTravelerCount = new JSpinner(spinnerModelAdult);

        spinnerModelChild = new SpinnerNumberModel(passChildInit, passCountMin, passCountMax, 1);
        childTravelerCount = new JSpinner(spinnerModelChild);

        //initialize delta logo
        logo = new ImageIcon("../img/logo.png");
        deltaLogo = new JLabel(logo);
        System.out.println("Height" + logo.getIconHeight());
        System.out.println("Width" + logo.getIconWidth());

        //initialize text fields
        desCityField = new JTextField("JFK");
        desCityField.setEditable(true);
        desCityField.setDocument(new LengthRestrictedDocument(3));
        desCityField.setColumns(3);

        depCityField = new JTextField("ATL");
        depCityField.setEditable(true);
        depCityField.setDocument(new LengthRestrictedDocument(3));
        depCityField.setColumns(3);

        //radio button
        oneWay = new JRadioButton("One Way");
        roundTrip = new JRadioButton("Round Trip");


        //button
        calculateButton = new JButton("Calculate");
        calculateButton.addActionListener(this);

        ButtonGroup tripType = new ButtonGroup();
        tripType.add(oneWay);
        tripType.add(roundTrip);

        // Create frame and add components using GridBagLayout


        setLayout(new GridBagLayout());
        layoutConst = new GridBagConstraints();
        layoutConst.insets = new Insets(10, 10, 1, 1);
        //layoutConst.anchor = GridBagConstraints.LINE_START;
        layoutConst.gridx = 0;
        layoutConst.gridy = 0;
        //layoutConst.gridwidth = 4;
        add(deltaLogo, layoutConst);

        setLayout(new GridBagLayout());
        layoutConst = new GridBagConstraints();
        layoutConst.insets = new Insets(10, 10, 1, 1);
        layoutConst.anchor = GridBagConstraints.LINE_START;
        layoutConst.gridx = 0;
        layoutConst.gridy = 1;
        layoutConst.gridwidth = 4;
        add(flightTitle, layoutConst);

        layoutConst = new GridBagConstraints();
        layoutConst.insets = new Insets(10, 10, 1, 1);
        layoutConst.anchor = GridBagConstraints.LINE_START;
        layoutConst.gridx = 0;
        layoutConst.gridy = 2;
        layoutConst.gridwidth = 1;
        add(desCityLabel, layoutConst);

        layoutConst = new GridBagConstraints();
        layoutConst.insets = new Insets(10, 10, 1, 1);
        layoutConst.anchor = GridBagConstraints.LINE_START;
        layoutConst.gridx = 2;
        layoutConst.gridy = 2;
        layoutConst.gridwidth = 1;
        add(depCityLabel, layoutConst);

        layoutConst = new GridBagConstraints();
        layoutConst.insets = new Insets(10, 10, 1, 10);
        layoutConst.fill = GridBagConstraints.HORIZONTAL;
        layoutConst.gridx = 1;
        layoutConst.gridy = 2;
        layoutConst.gridwidth = 1;

        add(desCityField, layoutConst);

        layoutConst = new GridBagConstraints();
        layoutConst.insets = new Insets(10, 10, 1, 10);
        layoutConst.fill = GridBagConstraints.HORIZONTAL;
        layoutConst.gridx = 3;
        layoutConst.gridy = 2;
        layoutConst.gridwidth = 1;
        add(depCityField, layoutConst);

        layoutConst = new GridBagConstraints();
        layoutConst.insets = new Insets(10, 10, 1, 1);
        layoutConst.fill = GridBagConstraints.HORIZONTAL;
        layoutConst.gridx = 0;
        layoutConst.gridy = 4;
        layoutConst.gridwidth = 1;
        add(roundTrip, layoutConst);

        layoutConst = new GridBagConstraints();
        layoutConst.insets = new Insets(10, 10, 1, 10);
        layoutConst.fill = GridBagConstraints.HORIZONTAL;
        layoutConst.gridx = 2;
        layoutConst.gridy = 4;
        layoutConst.gridwidth = 2;
        add(seatClassDrop, layoutConst);

        layoutConst = new GridBagConstraints();
        layoutConst.insets = new Insets(10, 10, 1, 1);
        layoutConst.fill = GridBagConstraints.HORIZONTAL;
        layoutConst.gridx = 0;
        layoutConst.gridy = 5;
        layoutConst.gridwidth = 1;
        add(oneWay, layoutConst);

        layoutConst = new GridBagConstraints();
        layoutConst.insets = new Insets(50, 10, 1, 1);
        layoutConst.anchor = GridBagConstraints.LINE_START;
        layoutConst.gridx = 0;
        layoutConst.gridy = 6;
        layoutConst.gridwidth = 4;
        add(passengerTitle, layoutConst);

        layoutConst = new GridBagConstraints();
        layoutConst.insets = new Insets(10, 10, 10, 1);
        layoutConst.fill = GridBagConstraints.LINE_START;
        layoutConst.gridx = 0;
        layoutConst.gridy = 7;
        layoutConst.gridwidth = 1;
        add(adultTravelerCountLabel, layoutConst);

        layoutConst = new GridBagConstraints();
        layoutConst.insets = new Insets(10, 10, 10, 10);
        layoutConst.fill = GridBagConstraints.HORIZONTAL;
        layoutConst.gridx = 1;
        layoutConst.gridy = 7;
        layoutConst.gridwidth = 1;
        add(adultTravelerCount, layoutConst);

        layoutConst = new GridBagConstraints();
        layoutConst.insets = new Insets(10, 10, 10, 10);
        layoutConst.fill = GridBagConstraints.LINE_START;
        layoutConst.gridx = 2;
        layoutConst.gridy = 7;
        layoutConst.gridwidth = 1;
        add(childTravelerCountLabel, layoutConst);

        layoutConst = new GridBagConstraints();
        layoutConst.insets = new Insets(10, 10, 10, 10);
        layoutConst.fill = GridBagConstraints.HORIZONTAL;
        layoutConst.gridx = 3;
        layoutConst.gridy = 7;
        layoutConst.gridwidth = 1;
        add(childTravelerCount, layoutConst);
    }




    //TODO: this
    public void stateChanged(ChangeEvent event) {
    }

    //TODO, also: this
    public void actionPerformed(ActionEvent event) {

    }


    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch(Exception ignored){}
        DeltaFlightFrame myFrame = new DeltaFlightFrame();

        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myFrame.pack();
        myFrame.setVisible(true);

    }
}

我确实在这里做了一些乱七八糟的事情:

logo = new ImageIcon("../img/logo.png");
deltaLogo = new JLabel(logo);
System.out.println("Height: " + logo.getIconHeight());
System.out.println("Width: " + logo.getIconWidth());

其输出是:

Height: -1 Width: -1

如果这是一个起点,我确实觉得很奇怪。

所以,我的问题是:我对 GridBagLayout 的设置是否会影响 JLabel 图像的显示?

最佳答案

使用website由 @camickr 提供,我能够使用他们的“createImageIcon”方法成功渲染图像。

关于java - GridBagLayout 会影响 JLabel 图像吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59259155/

相关文章:

java - 使用放心的java对不同的请求主体进行数据驱动测试的最佳方法

java - 使用 Gson 在 Java 中反序列化 RouteXL 响应很困难,因为 RouteXL 返回多个对象而不是数组

java - 根据 JTextField 的输入运行非标准评估(sin、cos、tan)

java - 我应该如何在 JLabel 下面添加 JButtons 的 GridLayout?

java - 使用 for 循环更改 JLabel 文本

java - 使用具有 API key 的 Artifactory Java 客户端?

java - 使用用户输入值显示数组列表中的特定对象

java - 使用 Java Swing 使多个 `JPanel` 的颜色一一改变,而不是全部改变

java - JTree 和 JButtons - 鼠标悬停在 Button 上时渲染错误

java - GridBagLayout 未在组件之间正确分配尺寸