setIcon не отображает изображения вообще - PullRequest
0 голосов
/ 30 марта 2020

Я перепробовал все возможные решения онлайн, но, похоже, ничего не работает. Я пытаюсь отобразить флаги для моей игры в угадывание флага. Я устанавливаю значок для JLabel flagIconJLabel в функции displayFlag () , но на самом деле он не показывает изображение флага при запуске программы. Я не вижу никаких ошибок, поэтому я застрял. Путь в порядке, я могу отображать изображения самостоятельно. Пожалуйста, помогите: /

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

public class FlagQuiz extends JFrame{
  private String[] countries = { "Russia", "China", "United States",
      "Italy", "Australia", "South Africa", "Brazil", "Spain" };

  private boolean[] flagsUsed = new boolean[countries.length];
  private int currentIndex;
  private int count = 1;
  private JPanel flagJPanel;
  private JLabel flagIconJLabel;
  private JLabel selectCountryJLabel;
  private JComboBox selectCountryJComboBox;
  private JTextField feedbackJTextField;
  private JButton submitJButton;
  private JButton nextFlagJButton;

  public FlagQuiz() {
    createUserInterface();
  }

  private void createUserInterface(){
    Container contentPane = getContentPane();
    contentPane.setLayout(null);

    flagJPanel = new JPanel();
    flagJPanel.setBounds(16, 8, 100, 90);
    flagJPanel.setLayout(null);
    flagJPanel.setBorder(new TitledBorder("Flag"));
    contentPane.add(flagJPanel);

    flagIconJLabel = new JLabel();
    flagIconJLabel.setBounds(10, 14, 80, 80);
    flagIconJLabel.setHorizontalAlignment(JLabel.CENTER);
    flagJPanel.add(flagIconJLabel);

    selectCountryJLabel = new JLabel();
    selectCountryJLabel.setBounds(136, 8, 88, 21);
    selectCountryJLabel.setText("Select country:");
    contentPane.add(selectCountryJLabel);

    Arrays.sort(countries);

    selectCountryJComboBox = new JComboBox(countries);
    selectCountryJComboBox.setBounds(136, 32, 135, 21);
    selectCountryJComboBox.setMaximumRowCount(3);
    contentPane.add(selectCountryJComboBox);

    displayFlag();

    // set up feedbackJTextFiel

    feedbackJTextField = new JTextField();
    feedbackJTextField.setBounds(136, 64, 135, 32);
    feedbackJTextField.setHorizontalAlignment(
        JTextField.CENTER);
    feedbackJTextField.setEditable(false);
    contentPane.add(feedbackJTextField);

    submitJButton = new JButton();
    submitJButton.setBounds(287, 8, 88, 32);
    submitJButton.setText("Submit");
    contentPane.add(submitJButton);
    submitJButton.addActionListener(
        new ActionListener(){
          public void actionPerformed(ActionEvent event){
            submitJButtonActionPerformed(event);}}
    );

    // set up nextFlagJButton
    nextFlagJButton = new JButton();
    nextFlagJButton.setBounds(287, 48, 88, 32);
    nextFlagJButton.setText("Next Flag");
    nextFlagJButton.setEnabled(false);
    contentPane.add(nextFlagJButton);
    nextFlagJButton.addActionListener(
    new ActionListener(){
          public void actionPerformed(ActionEvent event){
            nextFlagJButtonActionPerformed(event);}}
    );

    setTitle("Flag Quiz");
    setSize(390, 135);
    setVisible(true);
  }

  private int getUniqueRandomNumber(){
    Random generator = new Random();
    int randomNumber;
    do{
      randomNumber = generator.nextInt(8);}
    while (flagsUsed[randomNumber] == true);
    flagsUsed[randomNumber] = true;
    return randomNumber; }

  private void displayFlag(){
    currentIndex = getUniqueRandomNumber();
    String country =
        (String) selectCountryJComboBox.getItemAt(currentIndex);
    String countryPath = "images/" + country + ".png";
    flagIconJLabel.setIcon(new ImageIcon(countryPath));}

  private void submitJButtonActionPerformed(ActionEvent event){
    if (selectCountryJComboBox.getSelectedIndex()
        == currentIndex){
      feedbackJTextField.setText("Correct!");}
    else{
      feedbackJTextField.setText("Sorry, incorrect.");}
    if (count == 5){
      feedbackJTextField.setText(
          feedbackJTextField.getText() + "   Done!");
      nextFlagJButton.setEnabled(false);
      submitJButton.setEnabled(false);
      selectCountryJComboBox.setEnabled(false); }
    else{
      submitJButton.setEnabled(false);
      nextFlagJButton.setEnabled(true);}}

  private void nextFlagJButtonActionPerformed(ActionEvent event){
    displayFlag();
    count++;
    feedbackJTextField.setText("");       
    selectCountryJComboBox.setSelectedIndex(0);
    submitJButton.setEnabled(true);
    nextFlagJButton.setEnabled(false);}

  public static void main(String[] args){
    FlagQuiz application = new FlagQuiz();
    application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}

1 Ответ

1 голос
/ 31 марта 2020

попробуйте, это работает для меня, у меня есть изображение в том же пакете, но вы также можете отправить относительный путь, я использую другой конструктор imageicon, где при передаче URL я пытался передать путь к изображению, так как строка не работала для я

   protected static ImageIcon createImage(String path, String description) {
        URL imageURL = YourClass.class.getResource(path);

        if (imageURL == null) {
            System.err.println("Resource not found: " + path);
            return null;
        } else {
            return (new ImageIcon(imageURL, description));
        }
    }
...