Java 在面板中添加一个复杂的图像,并在一个自定义用户界面中围绕该图像添加按钮

Java 在面板中添加一个复杂的图像,并在一个自定义用户界面中围绕该图像添加按钮,java,swing,icons,jbutton,layout-manager,Java,Swing,Icons,Jbutton,Layout Manager,如何将下面的图像放入slavePanel,并在该JPanel的顶部调整JButtons,该按钮看起来像图像,但有正确的按钮环绕?(目前它们的形状为1行4列) 1) 您必须在每5个JButton()之前和之后准备图标 无焦点的基本图标 isRollover()的图标 isPressed()的图标 (二) 3) 将这些5个jbbutton放在JPanel上,画上圆圈(遥控器)从这开始,我开始改变MoveButton如下: this.setBorderPainted(false); 您可以给C

如何将下面的图像放入
slavePanel
,并在该JPanel的顶部调整
JButtons
,该按钮看起来像图像,但有正确的按钮环绕?(目前它们的形状为1行4列)

1) 您必须在每5个JButton()之前和之后准备图标

  • 无焦点的基本图标

  • isRollover()的图标

  • isPressed()的图标

(二)

3) 将这些
5个jbbutton
放在
JPanel
上,画上圆圈(遥控器)

从这开始,我开始改变
MoveButton
如下:

this.setBorderPainted(false);
您可以给
ControlPanel
。我还根据建议添加了一个背景图像和一些基于
按钮模型
状态的视觉反馈

  • 使用3x3
    GridLayout
  • 对于9个单元格中的每一个,获取一个子图像:
    • 对于每一个组件,添加一个带有子图像的标签
    • 对于每个其他组件,添加一个
      JButton
      ,从中删除空间。使用子图像作为图标,但您需要其他图标来指示焦点、激活等。此示例在“按下”图标周围放置红色边框

    import java.awt.*;
    导入java.awt.event.*;
    导入java.awt.image.buffereImage;
    导入javax.swing.*;
    导入java.net.URL;
    导入javax.imageio.imageio;
    公共类指南针按钮{
    公共CompassButtons(BuffereImage bi){
    int w=bi.getWidth();
    inth=bi.getHeight();
    int step=w/3;
    JPanel p=新的JPanel(新的网格布局(3,3));
    p、 挫折背景(颜色:黑色);
    整数计数=0;
    对于(int ii=0;ii{
    System.out.println(ae.getActionCommand());
    });
    p、 添加(按钮);
    }否则{
    JLabel标签=新JLabel(新图像图标(图标));
    p、 添加(标签);
    }
    计数++;
    }
    }
    JPanel center=newjpanel(newgridbaglayout());
    中间。背景(颜色。黑色);
    加(p);
    showMessageDialog(null,居中);
    }
    公共静态void main(字符串[]args)引发异常{
    URL=新URL(“http://i.stack.imgur.com/SNN04.png");
    final BufferedImage bi=ImageIO.read(url);
    SwingUtilities.invokeLater(()->{
    新罗盘按钮(bi);
    });
    }
    }
    
    “每5个按钮”5个按钮?我得到N/S/E/W为4 -但这是第五个按钮?@ Andrew Thompson <代码>这是第五个按钮?< /代码> EEEEHMM = = Enter键在中间区域(PANASONIC Reles有类似的设计)谢谢。上面编辑,中间的一个不重要,很难找到上/下/左/右,这很好用。@YumYumYum-heheh没有什么复杂的,这个帖子的回答很好(不包括我的人),是不是这一个很酷。请问button.setActionCommand(“+count”)的作用是什么做什么?Oracle java doc only explain:设置此按钮的操作命令。但是现在我不知道Action命令是什么意思了……@JianHe它被传递给创建的
    ActionEvent
    ,可以通过
    ActionEvent.getActionCommand()
    访问。我们可以交替使用
    ActionEvent.getSource()
    来查找源组件(比如
    JButton
    )。但更常见的情况是,我们为特定控件(或控件,如按钮和菜单)创建一个
    ActionListener
    (或
    Action
    ,例如
    saveEditsAction
    ),然后获取操作命令或源组件变得不相关。在该示例中,我在单个操作侦听器中使用了action命令,以缩短代码,并在控制台中显示按钮“number”。我得到了它。谢谢现在我完全明白了。
    package test;
    
    import java.awt.*;
    import java.awt.font.FontRenderContext;
    import java.awt.font.TextLayout;
    import javax.swing.*;
    
    public class New extends JFrame {
    
      private static final long serialVersionUID = 1L;
      private ImageIcon errorIcon =
              (ImageIcon) UIManager.getIcon("OptionPane.errorIcon");
      private Icon infoIcon =
              UIManager.getIcon("OptionPane.informationIcon");
      private Icon warnIcon =
              UIManager.getIcon("OptionPane.warningIcon");
    
      public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
          @Override
          public void run() {
            New t = new New();
          }
        });
      }
    
      public New() {
        setLayout(new BorderLayout());
    
        JPanel slavePanel = new NewPanel();
        slavePanel.setLayout(new GridLayout(0, 2, 4, 4));
        add(slavePanel);    
    
        JButton button = new JButton();
        button.setBorderPainted(false);
        button.setBorder(null);
        button.setFocusable(false);
        button.setMargin(new Insets(0, 0, 0, 0));
        button.setContentAreaFilled(false);
        button.setIcon((errorIcon));
        button.setRolloverIcon((infoIcon));
        button.setPressedIcon(warnIcon);
        button.setDisabledIcon(warnIcon);
        slavePanel.add(button);    
    
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
      }
    }
    
    
    package test;
    
    import java.awt.*;
    import java.io.IOException;
    import java.io.InputStream;
    import javax.imageio.ImageIO;
    import javax.swing.*;
    import javax.swing.border.Border;
    
    public class NewPanel extends JPanel {
    
      private Image imageGui;
      private static Dimension screen;
    
      public NewPanel() {
        try {
          imageGui =
                  ImageIO.read(
                  (InputStream) NewPanel.class.getResourceAsStream(
                  "/image/ptz.png"));
        } catch (IOException e) {
          e.printStackTrace(System.err);
        }
    
        Border border = BorderFactory.createEmptyBorder(11, 11, 11, 11);
        setOpaque(true);
        setBorder(border);
        setFocusable(true);
        setSize(getPreferredSize());
        revalidate();
        repaint();
        setVisible(true);
      }
    
      public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(imageGui, 0, 0,
                imageGui.getWidth(null), imageGui.getHeight(null), null);
        revalidate();
        repaint();
      }
    
      @Override
      public Dimension getPreferredSize() {
        return new Dimension(imageGui.getWidth(null), imageGui.getHeight(null));
      }
    }
    
    this.setBorderPainted(false);
    
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
    import javax.swing.*;
    import java.net.URL;
    import javax.imageio.ImageIO;
    
    public class CompassButtons {
    
        public CompassButtons(BufferedImage bi) {
            int w = bi.getWidth();
            int h = bi.getHeight();
            int step = w / 3;
            JPanel p = new JPanel(new GridLayout(3, 3));
            p.setBackground(Color.BLACK);
            int count = 0;
            for (int ii = 0; ii < w; ii += step) {
                for (int jj = 0; jj < h; jj += step) {
                    // This is it - GET THE SUB IMAGE
                    Image icon = bi.getSubimage(jj, ii, step, step);
                    if (count % 2 == 1) {
                        JButton button = new JButton(new ImageIcon(icon));
    
                        // make it transparent
                        button.setContentAreaFilled(false);
    
                        // remove border, indicate press using different icon
                        button.setBorder(null);
    
                        // make a 'pressed' icon..
                        BufferedImage iconPressed = new BufferedImage(
                                step, step, BufferedImage.TYPE_INT_ARGB);
                        Graphics g = iconPressed.getGraphics();
                        g.drawImage(icon, 0, 0, p);
                        g.setColor(Color.RED);
                        g.drawRoundRect(
                                0, 0,
                                iconPressed.getWidth(p) - 1, 
                                iconPressed.getHeight(p) - 1,
                                12, 12);
                        g.dispose();
                        button.setPressedIcon(new ImageIcon(iconPressed));
    
                        button.setActionCommand("" + count);
                        button.addActionListener((ActionEvent ae) -> {
                            System.out.println(ae.getActionCommand());
                        });
    
                        p.add(button);
                    } else {
                        JLabel label = new JLabel(new ImageIcon(icon));
                        p.add(label);
                    }
                    count++;
                }
            }
            JPanel center = new JPanel(new GridBagLayout());
            center.setBackground(Color.BLACK);
            center.add(p);
            JOptionPane.showMessageDialog(null, center);
        }
    
        public static void main(String[] args) throws Exception {
            URL url = new URL("http://i.stack.imgur.com/SNN04.png");
            final BufferedImage bi = ImageIO.read(url);
            SwingUtilities.invokeLater(() -> {
                new CompassButtons(bi);
            });
        }
    }