Как связать JButton с объектом и вызвать соответствующие методы - PullRequest
0 голосов
/ 27 февраля 2012

Я использую Java для создания n-головоломки (см. http://en.wikipedia.org/wiki/N-puzzle).. В настоящее время у меня она работает внутри JFrame, так что JFrame содержит JTextField, который принимает количество перемещаемых плиток, затемперемещает его, JTextArea, который содержит строку, переданную ему из метода, который переворачивает содержимое головоломки (который представляет собой двумерный массив объектов с именем Tile), и пару JButton для перезапуска или перестановки головоломки.ниже, если вы хотите попробовать его (работает только для квадратных головоломок, т. е. равно числу строк и столбцов).

Вот моя проблема - я хочу изменить способ работы JFrame, чтобы вместо TextArea иTextField Я хочу, чтобы вместо него был массив JButtons, который ссылается на соответствующие плитки в головоломке. Вот как:

 PuzzleFrame thisPuzzleFrame = new PuzzleFrame(4, 4);
 JButton[][] theseTiles = new JButton[4][4];
 int p = 0, o = 0;
    while (p < 4) {
        for (int i = 0; i < 15; i++) {
            for (o = 0; o < 4; o++) {
                //link each button to an element of the PuzzleFrame Tile[][]
                tiles[p][o] = new JButton(thisPuzzleFrame.Frame[p][o]); // this should refer a JButton to a Tile
                tiles[p][o].setBounds(o, p, 4, 4);
                        tiles[p][o].setText(Tile.toString(thisPuzzleFrame.Frame[p][o]) // this sets the face on the button to be the number associated with the Tile in PuzzleFrame.Frame[p][o]     

                i++;
            }
            o = 0;
            p++;
            i--;
        }
    }

А затем имеется ActionListener, который при нажатии вызывает метод slideTile вКласс PuzzleFrame вроде этого;

 //set up ActionListener
 PuzzleFrame.slideTile(thisPuzzleFrame, this); //method to slide the tile that has been pressed

Однако я застреваю, пытаясь заставить все это работать. Если бы кто-нибудь мог, я быПознакомьтесь с тем, как связать JButton с Tile, подобным этому, и найдите какой-то динамический способ добавления любого количества JButton-ов в JFrame, чтобы, если пользователь захочет сделать головоломку 5x5, соответствующие JButton появятся на JFrame вправильные места.

У меня нет проблем с компилятором и т. Д. Я просто спрашиваю о теории связывания моего объекта Tile с JButton, как указано выше.Далее следуют лишь фрагменты кода в том виде, в котором он есть в настоящее время, на случай, если он необходим

Это должны быть соответствующие методы и объекты на случай, если кто-то захочет их просмотреть - они не являются частьювопрос, но просто предыстория этого

   public class GUI extends JFrame {


        private static final long serialVersionUID = 1L;
        public static JLabel label;
        public static JTextField TextField;
        public static JTextArea OutPut;
        static int gRow, gColumn;
        static PuzzleFrame thisPuzzleFrame;
        public static JButton yes, no, shuffle, reset, setSolved;

        public GUI() {




            super("N Puzzle");
            setSize(500, 500);
            setVisible(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBackground(Color.black);
            setResizable(false); 

            setLayout(new FlowLayout());

            label = new JLabel(
                    "Please enter the number of rows you would like to use: ");
            add(label);

            TextField = new JTextField(18);
            add(TextField);
            TextField.requestFocus();
            TextField.setVisible(true);




            final ActionListener InputListener1 = new ActionListener() {
                public void actionPerformed(ActionEvent evt) {

                    gRow = Integer.parseInt(GUI.TextField.getText());

                    label.setText("Please enter the number of columns you would like to use: ");
                    TextField.setText("");              


                    ActionListener InputListener2 = new ActionListener() {
                        public void actionPerformed(ActionEvent evt) {



                            gColumn = Integer.parseInt(GUI.TextField.getText());
                            label.setText("Please select the tile you wish to move: ");

                            shuffle.setVisible(true);
                            setSolved.setVisible(true);
                            reset.setVisible(true);

                            TextField.setText("");
                            thisPuzzleFrame = new PuzzleFrame(gRow, gColumn);

                            try {
                                 PuzzleFrame.shufflePuzzle(GUI.thisPuzzleFrame,
                                 100000);
                            } catch (Exception e) {
                            }

                            OutPut.setText(PuzzleFrame.toString(thisPuzzleFrame));


                            ActionListener InputListener3 = new ActionListener() {
                                public void actionPerformed(ActionEvent evt) {

                                    int tileNo = Integer.parseInt(TextField
                                            .getText());

                                    try {
                                        PuzzleFrame.findAndSlide(thisPuzzleFrame,
                                                tileNo);
                                    } catch (Exception e) {
                                    }

                                    OutPut.setText(PuzzleFrame
                                            .toString(thisPuzzleFrame));
                                    TextField.setText("");
                            TextField.removeAll();
                            TextField.addActionListener(InputListener3);
                        }

                    };
                    TextField.removeAll();
                    TextField.addActionListener(InputListener2);
                }
            };

            TextField.addActionListener(InputListener1);

            yes = new JButton("Yes");
            no = new JButton("No");

            yes.setVisible(false);
            no.setVisible(false);
            add(yes);
            add(no);



        }


        public Tile(int rowIn, int columnIn, int no) {

            row = rowIn;
            column = columnIn;
            Number = no;
        }



        public static String toString(Tile tile) {


            String thisTile;

            if (tile != PuzzleFrame.empty) {
                thisTile = String.valueOf(tile.Number);
            } else {
                thisTile = " ";
            }

            return thisTile;

        }

    }



    public class PuzzleFrame {


        static Tile empty;
        int rowLength, columnLength;
        Tile[][] Frame;

        public PuzzleFrame(int rows, int columns) {

            rowLength = rows;
            columnLength = columns;

            Frame = MakePuzzleFrame(this);

        }

            public Tile[][] MakePuzzleFrame(PuzzleFrame thispuzzle) {

            Tile[][] theTiles = new Tile[thispuzzle.rowLength][thispuzzle.columnLength];


            int p = 0, o = 0;
            while (p < thispuzzle.rowLength) {
                for (int i = 0; i < ((thispuzzle.rowLength * thispuzzle.columnLength)); i++) {
                    for (o = 0; o < thispuzzle.columnLength; o++) {
                        Tile thisTile = new Tile(p, o, (i + 1));
                        thisTile.currentRow = p;
                        thisTile.currentColumn = o;
                        theTiles[p][o] = thisTile;
                        i++;
                    }
                    o = 0;
                    p++;
                    i--;
                }
            }


            empty = new Tile(thispuzzle.rowLength - 1, thispuzzle.columnLength - 1,
                    0);
            theTiles[thispuzzle.rowLength - 1][thispuzzle.columnLength - 1] = empty;
            empty.currentColumn = thispuzzle.rowLength - 1;
            empty.currentRow = thispuzzle.rowLength - 1;

            return theTiles;
        }

 public static void slideTile(PuzzleFrame puzzle, Tile tile)
                throws Exception {

            switch (isMoveAllowed(puzzle, tile)) {

            case 'D': {
                puzzle.Frame[tile.currentRow + 1][tile.currentColumn] = tile;
                puzzle.Frame[tile.currentRow][tile.currentColumn] = empty;
                empty.currentColumn = tile.currentColumn;
                empty.currentRow = tile.currentRow;
                tile.currentRow = tile.currentRow + 1;
                break;
            }
            case 'U': {
                puzzle.Frame[tile.currentRow - 1][tile.currentColumn] = tile;
                puzzle.Frame[tile.currentRow][tile.currentColumn] = empty;
                empty.currentColumn = tile.currentColumn;
                empty.currentRow = tile.currentRow;
                tile.currentRow = tile.currentRow - 1;
                break;
            }

            case 'L': {
                puzzle.Frame[tile.currentRow][tile.currentColumn - 1] = tile;
                puzzle.Frame[tile.currentRow][tile.currentColumn] = empty;
                empty.currentColumn = tile.currentColumn;
                empty.currentRow = tile.currentRow;
                tile.currentColumn = tile.currentColumn - 1;
                break;
            }
            case 'R': {
                puzzle.Frame[tile.currentRow][tile.currentColumn + 1] = tile;
                puzzle.Frame[tile.currentRow][tile.currentColumn] = empty;
                empty.currentColumn = tile.currentColumn;
                empty.currentRow = tile.currentRow;
                tile.currentColumn = tile.currentColumn + 1;
                break;
            }
            case 'N': {
                GUI.OutPut.append("\nInvalid slide!");
            }
            }
        }

1 Ответ

2 голосов
/ 27 февраля 2012

Использование кнопки предлагает несколько способов изменить внешний вид в порядке возрастания сложности:

  • Изменить текст кнопки, как показано в этой игре иэто пример .

  • Измените Icon кнопки, как показано в этом примере .

  • Переопределить paintComponent(), как показано здесь .

  • Заменить делегат пользовательского интерфейса кнопки полностью, как показано здесь .

См. Как использовать кнопки, флажки и радиокнопки для получения дополнительной информации.

Приложение: После того, как вы получили кнопкивнешний вид исчерпан, см. Как использовать действия для получения дополнительной информации о инкапсуляции ActionListener.

...