Adicione uma imagem complexa no painel, com botões ao redor dela em uma interface de usuário personalizada

Como posso ter essa imagem como abaixo no slavePanel e no topo desse JPanel ajustar os JButtons que se parecem com a imagem, mas com botões corretamente enrolados? (Agora eles são moldados em 1 linha, 4 colunas)

insira a descrição da imagem aqui

  // // Shot Gun mover up/down/left/right, middle on is for zoom // public void GunMover(JPanel configPanel) throws IOException { // Master Panel - holds everything JPanel masterPanel = new Panel(); masterPanel.setLayout(new SpringLayout()); // Slave Panel - with image background JPanel slavePanel = new Panel(); slavePanel.setLayout(new SpringLayout()); // Row 1 final JButton ptzLeft = new JButton(""); masterPanel.add(ptzRight, BorderLayout.CENTER); // Row 3 final JButton ptzUp = new JButton("^"); masterPanel.add(ptzUp, BorderLayout.WEST); // Row 4 final JButton ptzDown = new JButton("down"); masterPanel.add(ptzDown, BorderLayout.CENTER); // How do i add slavePanel this background and add all the JButtons // According to that image shape? // Layout the panel. SpringUtilities.makeCompactGrid(masterPanel, 1, 4, //rows, cols 6, 6, //initX, initY 6, 6); configPanel.setLayout(new GridLayout(0,1)); configPanel.add(masterPanel); } 

Acompanhamento: Excelente de Andrew Thompson + pelo menos meu método quebrado

insira a descrição da imagem aqui

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

    1. Use um GridLayout 3×3
    2. Para cada uma das 9 células, obtenha uma subimagem:
      • Para cada segundo componente, adicione um label com a subimagem.
      • Para cada outro componente, adicione um JButton do qual o espaço é removido. Use a subimagem como ícone, mas você precisará de icons alternativos para indicar foco, ativação, etc. Este exemplo coloca uma borda vermelha ao redor do ícone ‘pressionado’.

    Bússola

     import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import javax.swing.*; import java.io.IOException; 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.setOpaque(false); int count = 0; for (int ii=0; ii 

    A partir desse exemplo , comecei mudando o MoveButton assim:

     this.setBorderPainted(false); 

    Você poderia dar ao ControlPanel um Custom Layout Manager . Eu também adicionaria uma imagem de plano de fundo e algum tipo de feedback visual baseado no estado ButtonModel , como sugerido aqui .

    1) você tem que preparar os icons antes e para cada 5 JButtons ( evento aqui veio de ButtonModel )

    • ícone básico sem foco

    • Ícone para isRollover()

    • Ícone para isPressed()

    2) como definir icons e remover todos os “balastr” do JButton

    3) coloque esses 5 JButtons no JPanel com círculos pintados (RemoteSet)