0

我想知道这一点,因为我们正在 Swing 中制作游戏,并且我们制作了地图图块,jButtons而不是jPanels出于任何原因。现在我们想把单位放在上面,这样当单位在上面时地图背景仍然会显示。有谁知道这是否可能?

4

3 回答 3

2

好的,所以我不确定这是否真的是您正在寻找的内容以及您的应用程序当前的设置方式,但这是一个将 JButtons 置于彼此之上的示例(如果这不是您想要的,请考虑发布SSCCE提供更多详细信息)。还有其他替代方法和更好的方法来处理此类事情,但是由于您通过 JButton 询问 JButton,所以这里有一个片段显示:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.plaf.ButtonUI;
import javax.swing.plaf.basic.BasicButtonUI;

public class TestButtonGrid {

    protected int x;
    protected int y;

    protected void initUI() throws MalformedURLException {
        final JFrame frame = new JFrame();
        frame.setTitle(TestButtonGrid.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JPanel panel = new JPanel(new GridBagLayout());
        ImageIcon icon = new ImageIcon(new URL("http://manhack-arcade.net/pivot/isdrawing/tile_bluerock.png"));
        ImageIcon unit = new ImageIcon(new URL("http://static.spore.com/static/image/500/642/783/500642783372_lrg.png"));
        ButtonUI ui = new BasicButtonUI();
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        gbc.fill = GridBagConstraints.BOTH;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                gbc.gridx = i;
                gbc.gridy = j;
                JButton button = new JButton(icon);
                button.setBorderPainted(false);
                button.setPreferredSize(new Dimension(icon.getIconWidth(), icon.getIconHeight()));
                button.setUI(ui);
                button.setOpaque(false);
                panel.add(button, gbc);
                if (i == j) {
                    // Choose a layout that will center the icon by default
                    button.setLayout(new BorderLayout());
                    JButton player = new JButton(unit);
                    player.setPreferredSize(new Dimension(unit.getIconWidth(), unit.getIconHeight()));
                    player.setBorderPainted(false);
                    player.setUI(ui);
                    player.setOpaque(false);
                    button.add(player);
                }
            }
        }
        frame.add(panel);
        frame.setResizable(false);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new TestButtonGrid().initUI();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
            }
        });
    }

}
于 2012-07-12T14:35:30.067 回答
1

拥有一个包含按钮的面板可能是一个更好的主意。然后,您的面板可以使用鼠标事件侦听器在单击时执行操作。

使用 jPanel 的优点是您可以在其中设置布局,这将使您在其中定位按钮更加容易。

于 2012-07-12T14:12:39.993 回答
0

好吧,可以将 JButton 放在您无法看到的其他 JButton 上。

CardLayout cl = new CardLayout();
JPanel jpnlMain = new JPanel(cl);
jpnlMain.add(new JButton(), "FIRST");
jpnlMain.add(new JButton(), "SECOND");

然后也许您可以创建一个扩展 Cardlayout 或 JPanel 的类,以使其同时显示这两个项目。

编辑

做了一个小测试,HJere 是一个 Button Buttonception 中的一个 Button!

主类:

import javax.swing.JFrame;


public class Test {
    public static void main(String[] arg0){
        SpecialButton sp = new SpecialButton();
        JFrame jf = new JFrame();
        jf.add(sp);
        jf.setVisible(true);
        jf.pack();
    }
}

特殊按钮类:

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;


    public class SpecialButton extends JButton{
        SpecialButton(){
            super();
            JButton jbtnMid = new JButton();
            JLabel jlblMid = new JLabel(new ImageIcon(this.getClass().getResource("/Images/arrowUpIcon.png")));
            jbtnMid .add(jlblMid);
            this.add(jbtnMid);
            this.setVisible(true);
        }
    }
于 2012-07-12T13:52:09.687 回答