Вопрос по java, swing – Добавьте сложное изображение на панель с кнопками вокруг него в одном пользовательском интерфейсе

15

Как я могу получить это изображение, как показано нижеslavePanel и поверх этого JPanel отрегулируйтеJButtons который выглядит как изображение, но с правильно обернутыми кнопками? (Прямо сейчас они сформированы в 1 ряд, 4 столбца)

enter image description here

  //
  // 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(ptzLeft, BorderLayout.WEST);

    // Row 2
    final JButton ptzRight = 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);   
  }

Follow up: Отличный изAndrew Thompson  + по крайней мере мой сломанный метод

enter image description here

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

Ваш Ответ

3   ответа
3

событие здесь пришло от ButtonModel)

basic Icon without Focus

Icon for isRollover()

Icon for isPressed()

2) как установить иконки и убрать все "балласты" от JButton

3) поставить эти5 JButtons кJPanel с нарисованными кругами (RemoteSet)

"every 5 JButtons" 5 кнопок? Я получаю N / S / E / W за 4 - но какая 5-ая кнопка?
Спасибо. Отредактировано выше, середина не важна, было трудно найти вверх / вниз / влево / вправо, что приятно работает. YumYumYum
@ Эндрю Томпсонwhich is the 5th button? eeeehmmm == Введите ключ посередине в области CENTER (Panasonics Remotes имеет дизайн similair)
@YumYumYum Хе-хе, ничего сложного, отличные ответчики (исключая мою личность) в этой теме, не так ли?
14
Use a 3x3 GridLayout For each of the 9 cells get a subimage: For every second component, add a label with the subimage. For every other component, add a JButton from which the space is removed. Use the subimage as icon, but you'll need alternate icons to indicate focus, activation etc. This example puts a red border around the 'pressed' icon.

Compass Buttons

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

                    // remove the border - indicate action using a 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));

                    // make it transparent
                    button.setContentAreaFilled(false);

                    button.setActionCommand(""+count);
                    button.addActionListener(new ActionListener(){
                        @Override
                        public void actionPerformed(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 IOException {
        URL url = new URL("http://i.stack.imgur.com/SNN04.png");
        final BufferedImage bi = ImageIO.read(url);
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                new CompassButtons(bi);
            }
        });
    }
}
4

Начиная с этогопримерЯ начал с измененияMoveButton как это:

this.setBorderPainted(false);

Вы могли бы датьControlPanel Custom Layout Manager, Я также добавил бы фоновое изображение и некоторую визуальную обратную связь, основанную наButtonModel состояние, как предложеноВот.

"Custom Layout Manager."  Что не так сGridLayout?

Похожие вопросы