使用Java,尝试显示带有图像的jbuttons的可滚动列表,但是显示文本而不是按钮

时间:2015-12-31 05:39:15

标签: java swing

让我更详细地描述一下我的问题。我搜索了很多不同的方法,使用validate()并使用JLabels代替JButtons,但我的错误必须在其他地方,因为无论我尝试哪种方法,我都会得到每次都是同样的错误。控制台显示没有错误,程序运行正常,但JButtonJLabel显示为文本。从我读到的,这应该工作正常。我肯定错过了一些东西..请帮帮我,谢谢! :)

以下是显示为文字的按钮:http://i.stack.imgur.com/faK3Y.png

以下是代码的重要部分......我已经删除了部分代码,因为代码很多......

public class MasterViewport implements MouseListener, ActionListener, ItemListener, ListSelectionListener {
    JScrollPane tileSelectorScrollPane;
    JFrame tMapEditor;
    ArrayList<Tile> tileArray = new ArrayList<Tile>();
    JButton[] selectorTiles = new JButton[255];
    DefaultListModel<JButton> tileList;
    JList<JButton> tileSelector;
    ...

// lower in the code...
public Container createContentPane() {

    JPanel contentPane = new JPanel(new BorderLayout());
    contentPane.setOpaque(true);

    tileList = new DefaultListModel<JButton>();
    tileSelector = new JList<JButton>(tileList);
    tileSelector.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    tileSelector.setOpaque(true);
    tileSelector.setVisible(true);
    tileSelectorScrollPane = new JScrollPane(tileSelector);
    contentPane.add(tileSelectorScrollPane, BorderLayout.EAST);

    return contentPane;
}

//Now the method where the user selects a file in the select file dialog
//It's where it happens... As i confirm file selection, buttons show up as text.

...
while (!mapCreated) {
    createMap = newMapFile.showDialog(tMapEditor, "Create");
    if (createMap == JFileChooser.APPROVE_OPTION) {
        newMapFileName = newMapFile.getSelectedFile();
            if (!newMapFileName.getName().endsWith(".map")) {
                newMapFileName = new File(newMapFileName.getAbsolutePath() + ".map");
            }
            File[] dirMapFileNames = newMapFile.getCurrentDirectory().listFiles();
            BufferedImage bimg = null;
            String currentFileName = "";
            int width = 0, height = 0;
            String legendStr = "";
            char ch = 0;
            for (int i = 0; i < dirMapFileNames.length; i++) {
                if (newMapFileName.equals(dirMapFileNames[i])) {
                    mapFileAlreadyExists = true;
                }
                if (ch <= 255) {
                    if (dirMapFileNames[i].getName().endsWith(".png")) {
                        try {
                            bimg = ImageIO.read(dirMapFileNames[i]);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        width = bimg.getWidth();
                        height = bimg.getHeight();
                        if (width == 32 && height == 32) {
                            tileImageFound = true;
                            ImageIcon icon = new ImageIcon(dirMapFileNames[i].toString());
                            selectorTiles[ch] = new JButton("test", icon);
                            selectorTiles[ch].setOpaque(true);
                            selectorTiles[ch].setVisible(true);
                            Tile t = new Tile(ch, selectorTiles[ch]);
                            tileArray.add(t);
                            tileList.addElement(selectorTiles[ch]);
                            ch++;
                            legendStr = legendStr + "!" + ch + dirMapFileNames[i].getName();
                        }
                    }
                }
            ...

//Creating and showing the UI..

public static void createAndShowGUI() {
    JFrame tMapEditor = new JFrame("Tile Map Editor");
    MasterViewport masterViewport = new MasterViewport();
    tMapEditor.setJMenuBar(masterViewport.createMenuBar());
    tMapEditor.setContentPane(masterViewport.createContentPane());
    tMapEditor.setLocationRelativeTo(null);
    tMapEditor.setSize(800, 480);
    tMapEditor.setVisible(true);
}

2 个答案:

答案 0 :(得分:3)

您无法将按钮添加到JList。 JList只绘制组件的图像。

而是向Icon添加JList。 JList支持图标的默认渲染器。

如果您需要自定义课程,您还可以创建TileIcon ImageIcon以扩展GridLayout以保留您的额外属性。

如果您需要真实组件,请不要使用JList。而是使用带有document.getElementById('btn-addProduct').onclick = duplicate; var i = 0; var original = document.getElementById('step-content'); function duplicate() { var clone = original.cloneNode(true); // "deep" clone clone.id = "step-content" + ++i; // there can only be one element with an ID original.parentNode.appendChild(clone); $("#" + clone.id).find(".packaging input").each(function() { this.name = this.name + i }); }的JPanel并将按钮添加到面板。

答案 1 :(得分:0)

我通过添加以下内容解决了这个问题:

static class MyCellRenderer extends JLabel implements ListCellRenderer<Object> {
    public MyCellRenderer() {
        setOpaque(true);
    }

    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected,
            boolean cellHasFocus) {
        if (value.getClass().equals(JLabel.class)) {
            JLabel label = JLabel.class.cast(value);
            setIcon(label.getIcon());
            setBorder(label.getBorder());
        }
        return this;
    }
}