【问题标题】:is there a way to set a jbutton on top of a jbutton?有没有办法在 jbutton 上设置 jbutton?
【发布时间】:2012-07-12 13:20:13
【问题描述】:

我想知道这一点,因为我们正在使用 Swing 制作游戏,并且出于某种原因,我们将地图图块设置为 jButtons 而不是 jPanels。现在我们想把单位放在上面,这样当单位在上面时地图背景仍然会显示。有人知道这是否可能吗?

【问题讨论】:

  • 当然是可能的,没问题,有几种方法可以做到,但取决于明确和详细的问题,否则你会得到类似性质的答案....跨度>

标签: java swing jpanel jbutton sprite


【解决方案1】:

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

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();
                }
            }
        });
    }

}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 没有什么可以阻止您在 JButton 上设置 LayoutManager 并向其添加组件。所有的 JComponent 都是 Container。区别主要在于UI(ButtonUI)和它的“Button”行为。
    【解决方案3】:

    可以将一个 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);
            }
        }
    

    【讨论】:

    • 所以您根本看不到按钮?我问这是因为我朋友初始化的地图是由 jbuttons 制成的,但单位的图像部分清晰,所以我在地图上放了一个单位,我将看不到任何背景?跨度>
    • 你在制作什么游戏?如果您更改单元的属性,以便将 JButtons 绘制为图像并且该图像不是不透明的,您应该能够看到它。然而我认为你的地图应该是 JPanels。
    • @Alex Clem 可以回答这个问题
    • @mKorbel 是的,它有点抽象。
    • 正在制作 Civ 克隆,我知道它可能应该是 jpanels,但我想看看 jbuttons 是否仍然可行,因为在项目中还很远
    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 2013-03-10
    • 2013-01-07
    • 2015-06-27
    • 1970-01-01
    相关资源
    最近更新 更多