Для того, чтобы мой Jbutton с изображением был видимым, требовалось наведение мыши - PullRequest
0 голосов
/ 11 мая 2018

Наведение мыши требовалось для того, чтобы моя J-кнопка с изображением была видимой, я нигде не переопределял свою функцию рисования. Как отображать все кнопки с изображениями без необходимости зависания мыши?!

перед изображением зависания мыши

После наведения мыши на все кнопки J

public class JPicButton extends JButton {
int x, y, max;

/**
 * @param path
 *            :"resources/graphics/index.jpg"
 */
public JPicButton(String fileName, int max) {
    this.max = max;
    try {
        // ImageIcon mx = new ImageIcon(JPicButton.class.getResource("/graphics/" +
        // fileName)); #works
        Image img = ImageIO.read(JPicButton.class.getResource("/graphics/" + fileName));
        img = img.getScaledInstance(10 * (40 / max), 10 * (45 / max), Image.SCALE_SMOOTH);
        ImageIcon mc = new ImageIcon(img);
        this.setIcon(mc);
    } catch (Exception ex) {
        System.out.println(ex);
        ex.printStackTrace();
    }

}

public JPicButton() {

}

public void setOrigin(int x, int y) {
    this.x = x;
    this.y = y;
}

public void setPath(String fileName) {
    try {
        Image img = ImageIO.read(JPicButton.class.getResource("/graphics/" + fileName));
        img = img.getScaledInstance(10 * (40 / max), 10 * (45 / max), Image.SCALE_SMOOTH);
        ImageIcon mc = new ImageIcon(img);
        this.setIcon(mc);
    } catch (Exception ex) {
        System.out.println(ex);
        ex.printStackTrace();
    }
}

/**
 * @return the x
 */
public synchronized int getX() {
    return x;
}

/**
 * @return the y
 */
public synchronized int getY() {
    return y;
} }

эта кнопка также инициализируется в конструкторе Jpanel как

package Gui;

import javax.swing.JPanel;

 import javax.swing.JLabel;
 import javax.swing.SwingConstants;
 import java.awt.Font;
 import java.awt.Color;
 import javax.swing.JButton;
 import javax.swing.JFrame;

 @SuppressWarnings("serial")
 public class GamePage extends JPanel {
JPicButton groundMatrix[][];
int xMax, yMax;

public GamePage() {
    setBackground(Color.WHITE);
    setVisible(false);

    setLayout(null);
    setSize(700, 500);

    JLabel lblNewLabel = new JLabel("MineSweeper");
    lblNewLabel.setBounds(48, 13, 250, 50);
    add(lblNewLabel);
    lblNewLabel.setBackground(Color.PINK);
    lblNewLabel.setOpaque(true);
    lblNewLabel.setFont(new Font("Comic Sans MS", Font.PLAIN, 18));
    lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);

    JPanel game = new JPanel();
    game.setBounds(50, 80, 600, 400);
    add(game);
    game.setLayout(null);

    JLabel lblNewLabel_1 = new JLabel("");
    lblNewLabel_1.setBounds(342, 15, 66, 50);
    add(lblNewLabel_1);

    JLabel label = new JLabel("");
    label.setBounds(584, 13, 66, 50);
    add(label);

    JButton btnNewButton = new JButton("Reset");
    btnNewButton.setBounds(446, 15, 97, 50);
    add(btnNewButton);

    xMax = 15;
    yMax = 10;
    int Width = 40;
    groundMatrix = new JPicButton[xMax][yMax];

    for (int y = 0; y < yMax; y++) {
        for (int x = 0; x < xMax; x++) {
            groundMatrix[x][y] = new JPicButton("Layout1d.jpg", 10);
            groundMatrix[x][y].setLocation(Width * x, Width * y);
            groundMatrix[x][y].setSize(Width, Width);
            game.add(groundMatrix[x][y]);
            groundMatrix[x][y].setOrigin(x, y);

        }

    }

    // GridBagConstraints mineGround = new GridBagConstraints();
    // mineGround.gridheight = 45;
    // mineGround.gridwidth = 40;

}

/**
 * @return the groundMatrix
 */
public synchronized JPicButton[][] getGroundMatrix() {
    return groundMatrix;
}

/**
 * @param groundMatrix
 *            the groundMatrix to set
 */
public synchronized void setGroundMatrix(JPicButton[][] groundMatrix) {
    this.groundMatrix = groundMatrix;
}

/**
 * @return the xMax
 */
public synchronized int getxMax() {
    return xMax;
}

/**
 * @return the yMax
 */
public synchronized int getyMax() {
    return yMax;
}

public static void main(String args[]) {
    JFrame js = new JFrame();
    GamePage gd = new GamePage();
    gd.setVisible(true);
    js.add(gd);
    js.pack();
    js.setSize(700, 500);
    js.setVisible(true);
}
}

для полного посещения кода https://bitbucket.org/sarjuns/minesweeper/src

1 Ответ

0 голосов
/ 12 мая 2018

Наблюдения (tl; dr)

Проходя через ваш код, возникает ряд проблем, которые могут складываться вместе, вызывая всевозможные проблемы, если не сразу, то в будущем (и какрешение становится более сложным).

Надежность null макетов

Каждый раз, когда я смотрю в вашем коде, я вижу setLayout(null);.Это будет преследовать вас, особенно если вы попытаетесь запустить код на разных платформах

Swing, как и большинство достойных UI-фреймворков, имеет встроенную концепцию того, как компоненты должны быть расположены независимо от платформы.

Я бы настоятельно рекомендовал потратить некоторое время на просмотр Размещение компонентов внутри контейнера

Просматривая ваш код, я могу найти хорошие места для использования BorderLayout, GridBagLayout, GridLayout и CardLayout, которые значительно уменьшат сложность кода и упростят его изменение (при необходимости) и поддержку, а также поддержат различные платформы и конвейеры рендеринга.

Использование JLayeredPane из JFrame

getLayeredPane().add(gamepage); ... Я не уверен, какую выгоду вы рассчитывали получить, но это очень необычное решение.JLayeredPane - отличный способ отобразить пользователю информацию о стиле «всплывающих окон» или предоставить «оверлейную» информацию на панели содержимого, но это я.

Суть проблемы

В классе JPicButton вы реализуете два метода.

/**
 * @return the x
 */
public synchronized int getX() {
    return x;
}

/**
 * @return the y
 */
public synchronized int getY() {
    return y;
}

Проблема в том, что эти два метода уже определены JButton и относятся к месту, в котором кнопка должна быть расположена относительно ее родительского контейнера.,Переопределение этих методов означает, что при использовании setLocation значения игнорируются.

Поэтому, когда я изменяю ваш код для удаления этих методов, я получаю следующий результат ...

Finally laid out

Позиция "x / y", которой вы пытаетесь управлять, должна фактически управляться моделью, графический интерфейс должен просто представлять состояние модели.

Заключительные замечания

Я сделал несколько замечаний о состоянии вашего кода, для меня было бы непрофессионально поступать иначе, поскольку вы копаетесь в бесконечной дырепроблемы с работой и царапинами, которые могут быть легко решены с помощью имеющейся поддержки API.

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

...