Почему JPanel не отображается - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь работать с макетом сетки, и я пытаюсь разместить там несколько панелей, на которых есть какие-то данные, но ничто не отображается вообще.

Вот текущий код, который у меня есть:

package main.cache.test;

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class ImageView {

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ImageView window = new ImageView();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public ImageView() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        JFrame frmSpitePicker = new JFrame("Title");

        frmSpitePicker.setSize(658, 395);
        frmSpitePicker.setResizable(false);
        frmSpitePicker.setLocationRelativeTo(null);
        frmSpitePicker.getContentPane().setLayout(null);
        frmSpitePicker.setVisible(true);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(12, 35, 620, 303);
        frmSpitePicker.getContentPane().add(scrollPane);

        JPanel panel = new JPanel();
        scrollPane.setViewportView(panel);

        File file = new File("images/");
        panel.setLayout(new GridLayout((file.listFiles().length / 6), 6));

        int i = 0;

        // getting files name from folder
        for (String name : file.list()) {

            JPanel panel_1 = new JPanel();
            panel_1.setBounds(209, 362, 82, 87);
            frmSpitePicker.getContentPane().add(panel_1);
            panel_1.setLayout(null);

            // create label
            JLabel lblNewLabel = new JLabel((i++) + "");
            lblNewLabel.setBounds(12, 13, 56, 16);
            lblNewLabel.setIcon(new ImageIcon(new ImageIcon("images/" + name).getImage().getScaledInstance(8, 8, 1)));
            lblNewLabel.setHorizontalTextPosition(JLabel.CENTER);
            lblNewLabel.setVerticalTextPosition(JLabel.BOTTOM);
            panel_1.add(lblNewLabel);

            // create button
            JButton btnNewButton = new JButton("btn");
            btnNewButton.setBounds(12, 42, 58, 25);
            panel_1.add(btnNewButton);

            // add to the panel
            panel.add(panel_1);

        }
    }
}

Я не знаю, что с этим не так и почему Jpanel при добавлении не обрабатывается, но при добавлении JLabel будет работать.

Заранее спасибо!

1 Ответ

0 голосов
/ 22 октября 2019

Правильно используя макеты, мы можем легко получить что-то вроде этого:

enter image description here

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

public class ImageView {

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            try {
                ImageView window = new ImageView();
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }

    public ImageView() {
        initialize();
    }

    private void initialize() {
        int num = 32; // number of images to show..
        JFrame frmSpitePicker = new JFrame("Title");
        frmSpitePicker.setResizable(false);
        JPanel panel = new JPanel(new GridLayout(0, 6));
        JScrollPane scrollPane = new JScrollPane(panel, 
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        frmSpitePicker.getContentPane().add(scrollPane);

        for (int ii = 1; ii <= num; ii++) {

            JPanel panel_1 = new JPanel(new BorderLayout());

            // create label
            JLabel lblNewLabel = new JLabel(ii + "");
            lblNewLabel.setIcon(new ImageIcon(getImage()));
            lblNewLabel.setHorizontalTextPosition(JLabel.CENTER);
            lblNewLabel.setVerticalTextPosition(JLabel.BOTTOM);
            panel_1.add(lblNewLabel, BorderLayout.CENTER);

            // create button
            JButton btnNewButton = new JButton("btn");
            panel_1.add(btnNewButton, BorderLayout.PAGE_END);

            // add to the panel
            panel.add(panel_1);
            // hack to ensure our scroll bar is active 
            // we require 3 rows to be visible..
            if (ii==18) frmSpitePicker.pack();

        }
        frmSpitePicker.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        // Normally we'd call pack() here!
        //frmSpitePicker.pack();
        frmSpitePicker.setLocationRelativeTo(null);
        frmSpitePicker.setVisible(true);
    }

    java.util.Random r = new java.util.Random();

    private BufferedImage getImage() {
        int s = 16;
        BufferedImage bi = new BufferedImage(
                s, s, BufferedImage.TYPE_INT_RGB);
        Graphics g = bi.getGraphics();
        g.setColor(new Color(
                r.nextInt(255), r.nextInt(255), r.nextInt(255)));
        g.fillRect(0, 0, s, s);
        g.dispose();
        return bi;
    }
}

Обратите внимание, что я склонен использовать JListдля этого типа случая. panel_1 станет рендерером для POJO, в который будут заключены метка и кнопка. Но кнопка может не понадобиться, так как в списке могут быть прослушиватели для выбора и активации. Если это то, что делает кнопка, она будет избыточной в списке, и lblNewLabel может заменить весь panel_1.

Кстати - пожалуйста, убедитесь, что все ресурсы, необходимые для выполнения кода, доступны. Когда дело доходит до изображений, мы можем сделать горячую ссылку (загрузить по URL) на изображения, доступные в сети 1 , или сгенерировать их в коде (как здесь сделано).

  1. Oneспособ получить изображения для примера - горячая ссылка на изображения, видимые в в этом разделе вопросов и ответов . EG Этот ответ горячие ссылки на изображение, встроенное в этот вопрос .
...