Моля, вижте тази връзка: stackoverflow.com/questions/642822/ Поздрави

person Community    schedule 02.06.2012    source източник


Отговори (3)


  1. Използвайте 3x3 GridLayout
  2. За всяка от 9-те клетки вземете подизображение:
  • За всеки втори компонент добавете етикет с подизображението.
  • За всеки друг компонент добавете JButton, от който се премахва интервалът. Използвайте подизображението като икона, но ще ви трябват алтернативни икони, за да посочите фокус, активиране и т.н. Този пример поставя червена рамка около иконата „натиснат“.

Бутони на компаса

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);
        });
    }
}
person Andrew Thompson    schedule 02.06.2012
comment
Този е толкова готин. Мога ли да попитам какво прави button.setActionCommand("" + count);? Oracle java doc обяснява само: Задава командата за действие за този бутон. Но сега нямам представа какво означава команда за действие..... - person Jian He; 16.06.2021
comment
@JianHe Предава се на създадения ActionEvent и може да бъде достъпен чрез ActionEvent.getActionCommand(). Можем алтернативно да използваме ActionEvent.getSource(), за да намерим изходния компонент (като JButton). Но по-често създаваме ActionListener (или Action - напр. saveEditsAction) за конкретен контрол (или контроли - като бутон и меню) и след това получаването на командата за действие или изходния компонент става без значение. Използвах командата за действие в слушател на едно действие в този пример, за да направя кода по-кратък и да покажа бутона „номер“ в конзолата. - person Andrew Thompson; 16.06.2021
comment
чрез това (stackoverflow.com/questions/8214958/). Разбрах. Благодаря. Сега го разбирам напълно. - person Jian He; 16.06.2021

1) трябва да подготвите иконите преди и за всеки 5 JButtons (събитието тук идва от ButtonModel)

  • основна икона без фокус

  • Икона за isRollover()

  • Икона за isPressed()

2) как да зададете икони и да премахнете целия "баласт" от JButton

3) поставете тези 5 JButtons към JPanel с нарисувани кръгове (RemoteSet)

person mKorbel    schedule 02.06.2012
comment
всеки 5 JButtons 5 бутона? Получавам N/S/E/W за 4 - но кой е 5-ият бутон? - person Andrew Thompson; 02.06.2012
comment
@Andrew Thompson which is the 5th button? eeeehmmm == Въведете клавиш в средата в ЦЕНТЪРНАТА област (дистанционното управление на Panasonic има подобен дизайн) - person mKorbel; 02.06.2012
comment
Благодаря ти. Редактирано по-горе, средното не е важно, беше трудно да се намери нагоре/надолу/наляво/надясно, което работи добре. - person ; 02.06.2012
comment
@YumYumYum хехех нищо сложно, страхотни отговори (с изключение на моя човек) в тази тема, нали - person mKorbel; 02.06.2012