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