【问题标题】:What is a good way to make a application selector layout? JAVA JFRAME制作应用程序选择器布局的好方法是什么? JAVA JFRAME
【发布时间】:2022-06-29 12:13:31
【问题描述】:

我正在尝试用 java 制作一个应用程序启动器,它启动不同的应用程序,例如,一个用于蛇游戏,一个用于益智游戏等。这是我想要的示例: enter image description here 发射器设计

我不知道该怎么做,有什么想法吗?

【问题讨论】:

  • 取决于游戏数量是否固定(是否会添加/删除游戏?您是否可以每次发生这种情况都重新设计界面?),以及您有多少时间。如果您希望它看起来正式并自动适应调整的游戏数量,那么事情可以真正快速地参与进来。您可以默认使用游戏的 JComboBox,并在 JLabel 中为所选游戏提供侧面板预览,并在 ImageIcon 中提供相应的图像。如果可以使用固定大小的启动器或自定义数学,您还可以拥有一堆嵌套布局,包括空布局。
  • 我使用一个数据库,其中包含每个我需要的应用程序名称,以便添加一个新的应用程序或按钮来启动该应用程序,也许 jcombobox 是更好的主意,但不是这样好看
  • 我只需要一个 JList 和一个 HORIZONTAL_WRAP - 请参阅 How to Use Lists 了解更多详情
  • 您可以尝试使用带有图像图标的 JButton 的网格布局,或者如果这不起作用,则可以使用带有响应鼠标事件的图像图标的 JLabels 的子类。如果您可以接受它不是一个完美的网格,您可以使用 FlowLayout。如果您对固定启动器没问题,请随意定位的空布局。取决于您想要获得的参与程度/您想要的定制程度,您可以做相当复杂的 JLabel 或 JPanel 子类来包含图像和文本。

标签: java swing jframe launcher


【解决方案1】:

就我个人而言,我会从JListHORIZONTAL_WRAP 开始

详情请见How to Use Lists

例如...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Image;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    List<Game> games = new ArrayList<>(Arrays.asList(new Game[]{
                        new Game("Assiassins Creed - Black Flag", ImageIO.read(getClass().getResource("/boxart/AssassinsCreedBlackFlag.png"))),
                        new Game("Assiassins Creed - Unit", ImageIO.read(getClass().getResource("/boxart/AssassinsCreedUnity.png"))),
                        new Game("Battlefield 3", ImageIO.read(getClass().getResource("/boxart/BattleField3.png"))),
                        new Game("BioShock", ImageIO.read(getClass().getResource("/boxart/BioShock.png"))),
                        new Game("Borderlands", ImageIO.read(getClass().getResource("/boxart/BorderLands.png"))),
                        new Game("Dead standing", ImageIO.read(getClass().getResource("/boxart/DeadStanding.png"))),
                        new Game("Dishonored", ImageIO.read(getClass().getResource("/boxart/Dishnonored.png"))),
                        new Game("Fallout 4", ImageIO.read(getClass().getResource("/boxart/Fallout4.png"))),
                        new Game("Far Cry Primal", ImageIO.read(getClass().getResource("/boxart/FarCryPrimal.png"))),
                        new Game("Halflife", ImageIO.read(getClass().getResource("/boxart/HalfLife.png"))),
                        new Game("Jedi Fallen Order", ImageIO.read(getClass().getResource("/boxart/JediFallenOrde.png"))),
                        new Game("Kings Quest VII", ImageIO.read(getClass().getResource("/boxart/KingsQueteVII.png"))),
                        new Game("Leisure Suit Larry in the Land of the Lounge Lizards", ImageIO.read(getClass().getResource("/boxart/LSL.png"))),
                        new Game("Mass Effect 2", ImageIO.read(getClass().getResource("/boxart/Mass Effect 2.png"))),
                        new Game("Mass Effect 3", ImageIO.read(getClass().getResource("/boxart/Mass Effect 3.png"))),
                        new Game("Mass Effect", ImageIO.read(getClass().getResource("/boxart/Mass Effect.png"))),
                        new Game("Space Quest IV", ImageIO.read(getClass().getResource("/boxart/SpaceQuestIV.png"))),
                        new Game("Tomb Raider", ImageIO.read(getClass().getResource("/boxart/TombRaider.png"))),
                        new Game("Zelda - Breath of the wild", ImageIO.read(getClass().getResource("/boxart/Zelda.png")))
                    }));

                    JFrame frame = new JFrame();
                    frame.add(new LaunchPane(games));
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        });
    }

    public class LaunchPane extends JPanel {
        public LaunchPane(List<Game> games) {
            System.out.println(games.size());
            setLayout(new BorderLayout());
            DefaultListModel<Game> model = new DefaultListModel<>();
            model.addAll(games);

            JList list = new JList(model);
            list.setBackground(Color.BLACK);
            list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
            list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
            list.setCellRenderer(new GameListCellRenderer());
            list.setVisibleRowCount(3);

            add(new JScrollPane(list));
        }
    }

    public class GameListCellRenderer extends DefaultListCellRenderer {
        public GameListCellRenderer() {
            setHorizontalAlignment(CENTER);
            setVerticalAlignment(CENTER);
            setHorizontalTextPosition(CENTER);
            setVerticalTextPosition(BOTTOM);
        }

        @Override
        public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            if (value instanceof Game) {
                Game game = (Game) value;
                setIcon(new ImageIcon(game.getBoxArt()));
                setText(null);
            }
            return this;
        }

    }

    public class Game {
        private String title;
        private Image boxArt;

        public Game(String title, Image boxArt) {
            this.title = title;
            this.boxArt = boxArt;
        }

        public String getTitle() {
            return title;
        }

        public Image getBoxArt() {
            return boxArt;
        }

    }
}

现在,如果您想对其进行更多自定义,您可以创建一个完全自定义的ListCellRenderer,例如...

public class GameListCellRenderer extends JPanel implements ListCellRenderer<Game> {

    private static Border EMPTY_BORDER = new EmptyBorder(1, 1, 1, 1);
    private static Border SELECTED_BORDER = new LineBorder(Color.BLUE, 1);

    private Map<Game, String> cachedTitle = new HashMap<>();
    private Map<Game, ImageIcon> cachedIcon = new HashMap<>();

    private JLabel titleLabel;
    private JLabel artboxLabel;

    public GameListCellRenderer() {
        setOpaque(false);

        titleLabel = new JLabel();
        titleLabel.setForeground(Color.WHITE);
        artboxLabel = new JLabel();

        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridwidth = gbc.REMAINDER;
        gbc.weightx = 1;
        gbc.fill = gbc.HORIZONTAL;

        add(artboxLabel, gbc);
        add(titleLabel, gbc);
    }

    @Override
    public Component getListCellRendererComponent(JList<? extends Game> list, Game value, int index, boolean isSelected, boolean cellHasFocus) {
        ImageIcon icon = cachedIcon.get(value);
        if (icon == null) {
            icon = new ImageIcon(value.getBoxArt());
            cachedIcon.put(value, icon);
        }
        String title = cachedTitle.get(value);
        if (title == null) {
            FontMetrics fm = getFontMetrics(titleLabel.getFont());
            title = value.getTitle();

            if (fm.stringWidth(title) > 150) {
                do {
                    title = title.substring(0, title.length() - 1);
                } while (fm.stringWidth(title) > 150);
                title = title.substring(0, title.length() - 3) + "...";
            }
            cachedTitle.put(value, title);
        }

        titleLabel.setText(title);
        artboxLabel.setIcon(icon);
        setBorder(isSelected ? SELECTED_BORDER : EMPTY_BORDER);
        return this;
    }

}

并且在不改变任何其他内容的情况下,它将产生...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    相关资源
    最近更新 更多