JPanel или JLabel, кажется, создают две метки вместо одной для каждого объекта? - PullRequest
1 голос
/ 12 октября 2011

Пожалуйста, извините, если это очень простое решение или глупая ошибка - я впервые пытаюсь реализовать графику в Java!:)

Я пытаюсь создать доску плиток, каждая из которых является объектом плитки, и все позиции плиток хранятся в тройном массиве плиток, называемых «содержимым» (content [] [] []).

Чтобы сделать каждую плитку «кликабельной», я в основном создаю метку с каждым значком плитки и размещаю эту плитку на доске на основе координат x, y объекта плитки.Я делаю это для каждого из ненулевых объектов Tile в массиве содержимого.

Это прекрасно работает, когда я использую функцию graphics.drawImage, но когда я размещаю каждую метку с помощью функции setBorders () it:

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

и

  1. Создает дубликатНерасположенный слой выше других плиток, которые находятся в своего рода правильном положении.

Код для функции, которую я вызываю:

    public void paintComponent(Graphics graphics) {
    // let superclass paint to fill in background
    super.paintComponent(graphics);
    Tile[][][] content = b.getContent();

    if (content==null || tileImages==null) {
        return;
    }

    /* Set dummy previous label */ 
    prevT.setBounds(-1,-1,1,1);

    // draw tiles back to front

    for (int i = 0; i<content.length; i++) {
        for (int y = 0; y<content[i].length; y++) {
            for (int x = 0; x<content[i][y].length; x++) {
                final Tile t = content[i][y][x];
                if (t!=null) {
                    if (y>0 && content[i][y-1][x]!=null && t.equals(content[i][y-1][x])) {
                        continue;
                    }
                    if (x>0 && content[i][y][x-1]!=null && t.equals(content[i][y][x-1])) {
                        continue;
                    }
                    Image image = tileImages[t.getValue()][t.getSubindex()];

                    if (b.free(t)) {
                        image = tileImagesHL[t.getValue()][t.getSubindex()];

                    }

                    /* Mouse event magic */

                    graphics.drawImage(image, x*TILEW+TILEW/2+i*TILESKEW, (y+1)*TILEH/2-i*TILESKEW, null);

                    /* Create icon to be displayed */
                    ImageIcon icon = new ImageIcon(image);
                    /* Label that acts as the clickable tile */
                    final JLabel label = new JLabel();

                    /* Associate image with label */
                    label.setIcon(icon);

                    /* Allow mouse events to interact with label */
                    label.addMouseListener(this);

                    /* Position labels according to tile coordinates */
                    label.setBounds(x*TILEW+TILEW/2+i*TILESKEW, (y+1)*TILEH/2-i*TILESKEW, image.getWidth(null), image.getHeight(null));

                    /* Associate label with specified tile */
                    t.setLabel(label);

                    /* Add label to list*/
                    labels.add(label);

                    this.setVisible(true);
                    this.add(label);

                }
            }
        }
    }
}

Любое объяснение, почему этопроисходит будет очень ценится!Я пытался переписать эту функцию так много раз, и у меня нет идей!

Спасибо!:)

1 Ответ

3 голосов
/ 12 октября 2011

1) не создавайте Object внутри paintComponent(Graphics graphics), подготовьте эти Object до

мой взгляд, простой командир с Магией событий магии без MouseListener

2) создайте JPanel и поместите туда JButton#setBackground(someColor) и добавьте JButton#setRolloverIcon(someIcon), больше не нужно MouseListener

3) если вы создаете плитки, ищите GridLayout

4) подготовьте Icons и добавьте эти Icon к JButton, больше ничего, Array из Objects, никакого кода больше, чем я описал

enter image description here enter code here

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

public class TilesWithButton {

    private Icon warningIcon = UIManager.getIcon("OptionPane.warningIcon");
    private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon");
    private Icon errorIconRoll = UIManager.getIcon("OptionPane.errorIcon");
    private JPanel myPanel = new JPanel();

    public TilesWithButton() {
        myPanel.setLayout(new GridLayout(1, 2, 1, 1));

        JButton btn = new JButton();
        btn.setBackground(Color.white);
        btn.setIcon(infoIcon);
        btn.setRolloverIcon(errorIconRoll);
        btn.setFocusPainted(false);
        myPanel.add(btn);

        JButton btn1 = new JButton();
        btn1.setBackground(Color.white);
        btn1.setIcon(warningIcon);
        btn1.setRolloverIcon(errorIconRoll);
        btn1.setFocusPainted(false);
        myPanel.add(btn1);

        JFrame frame = new JFrame("Tiles");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(myPanel);
        frame.pack();
        frame.setLocation(150, 100);
        frame.setVisible(true);
    }

    public static void main(final String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                TilesWithButton tilesWithButton = new TilesWithButton();
            }
        });
    }
}
...