Проблема с радиокнопкой

Итак, для этого класса в java вот мой код

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
import javax.swing.border.*;

public class RadioSelection extends JFrame implements ActionListener
{
private ActionListener action;  
private JButton[][] button;
private JPanel bottomPanel;
private LineBorder lineBorder;

private int randomRowLimit;
private int randomColumnLimit;
private Random random;
private int size;
JLabel label = new JLabel("Select the no. of Grid");
public RadioSelection()
{
    randomRowLimit = 0;
    randomColumnLimit = 0;
    random = new Random();
    size = 0;

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationByPlatform(true);

    lineBorder = new LineBorder(Color.BLUE.darker());


    JPanel topPanel = new JPanel();
    topPanel.setLayout(new FlowLayout(FlowLayout.LEFT));

    bottomPanel = new JPanel();

    final JRadioButton threeSquareButton = new JRadioButton("3 X 3", false);
    final JRadioButton fourSquareButton = new JRadioButton("4 X 4", false);
    final JRadioButton fiveSquareButton = new JRadioButton("5 X 5", false);

    threeSquareButton.setBorder(lineBorder);
    fourSquareButton.setBorder(lineBorder);
    fiveSquareButton.setBorder(lineBorder);
    label.setFont(null);
    action = new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {

            if (ae.getSource() == threeSquareButton)
            {
                remove(bottomPanel);
                bottomPanel = getCenterPanel(3);
                add(bottomPanel, BorderLayout.CENTER);
            }
            else if (ae.getSource() == fourSquareButton)
            {
                remove(bottomPanel);
                bottomPanel = getCenterPanel(4);
                add(bottomPanel, BorderLayout.CENTER);
            }
            else if (ae.getSource() == fiveSquareButton)
            {

                remove(bottomPanel);
                bottomPanel = getCenterPanel(5);
                add(bottomPanel, BorderLayout.CENTER);
            }


            invalidate(); // If you are using JDK 1.7 +
            //getContentPane().revalidate(); // if you using JDK 1.6 or lower
              repaint();
          }
      };

    threeSquareButton.addActionListener(action);
    fourSquareButton.addActionListener(action);
    fiveSquareButton.addActionListener(action);

    ButtonGroup bg = new ButtonGroup();
    bg.add(threeSquareButton);
    bg.add(fourSquareButton);
    bg.add(fiveSquareButton);


    topPanel.add(label);
    topPanel.add(threeSquareButton);
    topPanel.add(fourSquareButton);
    topPanel.add(fiveSquareButton);

    add(topPanel, BorderLayout.PAGE_START);

    add(bottomPanel, BorderLayout.CENTER);

    setSize(300, 300);
    //pack();
    setVisible(true);
 }
 private JPanel getCenterPanel(int size)
 {
    JPanel bottomPanel = new JPanel(new GridLayout(size, size));
    button = new JButton[size][size];
    this.size = size;

    for (int row = 0; row < size; row++)
    {
        for (int column = 0; column < size; column++)
        {
            button[row][column] = new JButton();
            button[row][column].setBorder(lineBorder);
            button[row][column].setMargin(new Insets(2, 2, 2, 2));
            button[row][column].addActionListener(this);
            bottomPanel.add(button[row][column]);
        }
    }

    randomRowLimit = random.nextInt(size);
    randomColumnLimit = random.nextInt(size);
    button[randomRowLimit][randomColumnLimit].setText("mouse");

    return bottomPanel;
}

 public void actionPerformed(ActionEvent ae)
{
    JButton button = (JButton) ae.getSource();

    if ((button.getText()).equals("mouse"))
    {
        randomRowLimit = random.nextInt(size);
        randomColumnLimit = random.nextInt(size);
        System.out.println("Row : " + randomRowLimit);
        System.out.println("Column : " + randomColumnLimit);
        button.setText("");
        this.button[randomRowLimit][randomColumnLimit].setText("mouse");            
    }
    else
    {
   JOptionPane.showMessageDialog(this, "Catch the mouse!", "Small Game : ",                     JOptionPane.ERROR_MESSAGE);
    }
}

public static void main(String... args)
{
    SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {

            new RadioSelection();
        }
    });
}

}

Этот работает, но если вы заметили, здесь я использовал invalidate();. Если это revalidate();, он не запустится. Однако меня беспокоит то, что при нажатии переключателя (например, 3x3) кнопка не будет отображаться автоматически. Рамка должна быть отрегулирована в первую очередь до того, как появятся кнопки гирда. Как я могу работать с этим?


person shielomarie    schedule 07.03.2012    source источник
comment
Что/где переключатели 3x3 и 4x4?   -  person Harry Joy    schedule 07.03.2012
comment
ты случайно не забыл тег домашнего задания :-)   -  person kleopatra    schedule 07.03.2012
comment
Кто-то уже ответил на мой вопрос. Ну, не уверен в его ответе, но я попробую код, который он мне дает, спасибо за ваше время, ребята.   -  person shielomarie    schedule 07.03.2012


Ответы (2)


Попробуйте этот код:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class RadioSelection extends JFrame
{
    private ActionListener action;  
    private JPanel bottomPanel;
    private LineBorder lineBorder ;

    public RadioSelection()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);

        lineBorder = new LineBorder(Color.BLUE.darker());

        JPanel topPanel = new JPanel();
        topPanel.setLayout(new FlowLayout(FlowLayout.LEFT));

        bottomPanel = new JPanel();

        final JRadioButton threeSquareButton = new JRadioButton("3 X 3", false);
        final JRadioButton fourSquareButton = new JRadioButton("4 X 4", false);

        threeSquareButton.setBorder(lineBorder);
        fourSquareButton.setBorder(lineBorder);

        action = new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                if (ae.getSource() == threeSquareButton)
                {
                    remove(bottomPanel);
                    bottomPanel = getCenterPanel(3);
                    add(bottomPanel, BorderLayout.CENTER);
                }
                else if (ae.getSource() == fourSquareButton)
                {
                    remove(bottomPanel);
                    bottomPanel = getCenterPanel(4);
                    add(bottomPanel, BorderLayout.CENTER);
                }
                revalidate(); // If you are using JDK 1.7 +
                // getContentPane().revalidate(); // if you using JDK 1.6 or lower
                repaint();
            }
        };

        threeSquareButton.addActionListener(action);
        fourSquareButton.addActionListener(action);

        ButtonGroup bg = new ButtonGroup();
        bg.add(threeSquareButton);
        bg.add(fourSquareButton);

        topPanel.add(threeSquareButton);
        topPanel.add(fourSquareButton);

        add(topPanel, BorderLayout.PAGE_START);
        add(bottomPanel, BorderLayout.CENTER);

        setSize(300, 300);
        setVisible(true);
    }

    private JPanel getCenterPanel(int size)
    {
        JPanel bottomPanel = new JPanel(new GridLayout(size, size));

        for (int row = 0; row < size; row++)
        {
            for (int column = 0; column < size; column++)
            {
                JButton button = new JButton("Button " + row + " " + column);
                button.setBorder(lineBorder);
                button.setMargin(new Insets(2, 2, 2, 2));
                bottomPanel.add(button);
            }
        }

        return bottomPanel;
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new RadioSelection();
            }
        });
    }
}

Вот результат этого:

3 X 3 MATRIXи 4 X 4 МАТРИЦА

Добавлен этот новый код, чтобы ответить на новую вещь:

import java.awt.*;
import java.awt.event.*;

import java.util.Random;

import javax.swing.*;
import javax.swing.border.*;

public class RadioSelection extends JFrame implements ActionListener
{
    private ActionListener action;  
    private JButton[][] button;

    private JPanel bottomPanel;
    private LineBorder lineBorder;

    private int randomRowLimit;
    private int randomColumnLimit;
    private Random random;
    private int size;

    public RadioSelection()
    {
        randomRowLimit = 0;
        randomColumnLimit = 0;
        random = new Random();
        size = 0;

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);

        lineBorder = new LineBorder(Color.BLUE.darker());

        JPanel topPanel = new JPanel();
        topPanel.setLayout(new FlowLayout(FlowLayout.LEFT));

        bottomPanel = new JPanel();

        final JRadioButton threeSquareButton = new JRadioButton("3 X 3", false);
        final JRadioButton fourSquareButton = new JRadioButton("4 X 4", false);
        final JRadioButton fiveSquareButton = new JRadioButton("5 X 5", false);

        threeSquareButton.setBorder(lineBorder);
        fourSquareButton.setBorder(lineBorder);
        fiveSquareButton.setBorder(lineBorder);

        action = new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                if (ae.getSource() == threeSquareButton)
                {
                    remove(bottomPanel);
                    bottomPanel = getCenterPanel(3);
                    add(bottomPanel, BorderLayout.CENTER);
                }
                else if (ae.getSource() == fourSquareButton)
                {
                    remove(bottomPanel);
                    bottomPanel = getCenterPanel(4);
                    add(bottomPanel, BorderLayout.CENTER);
                }
                else if (ae.getSource() == fiveSquareButton)
                {
                    remove(bottomPanel);
                    bottomPanel = getCenterPanel(5);
                    add(bottomPanel, BorderLayout.CENTER);
                }
                revalidate(); // If you are using JDK 1.7 +
                // getContentPane().revalidate(); // if you using JDK 1.6 or lower
                repaint();
            }
        };

        threeSquareButton.addActionListener(action);
        fourSquareButton.addActionListener(action);
        fiveSquareButton.addActionListener(action);

        ButtonGroup bg = new ButtonGroup();
        bg.add(threeSquareButton);
        bg.add(fourSquareButton);
        bg.add(fiveSquareButton);

        topPanel.add(threeSquareButton);
        topPanel.add(fourSquareButton);
        topPanel.add(fiveSquareButton);

        add(topPanel, BorderLayout.PAGE_START);
        add(bottomPanel, BorderLayout.CENTER);

        setSize(300, 300);
        //pack();
        setVisible(true);
    }

    private JPanel getCenterPanel(int size)
    {
        JPanel bottomPanel = new JPanel(new GridLayout(size, size));
        button = new JButton[size][size];
        this.size = size;

        for (int row = 0; row < size; row++)
        {
            for (int column = 0; column < size; column++)
            {
                button[row][column] = new JButton();
                button[row][column].setBorder(lineBorder);
                button[row][column].setMargin(new Insets(2, 2, 2, 2));
                button[row][column].addActionListener(this);
                bottomPanel.add(button[row][column]);
            }
        }

        randomRowLimit = random.nextInt(size);
        randomColumnLimit = random.nextInt(size);
        button[randomRowLimit][randomColumnLimit].setText("X");

        return bottomPanel;
    }

    public void actionPerformed(ActionEvent ae)
    {
        JButton button = (JButton) ae.getSource();

        if ((button.getText()).equals("X"))
        {
            randomRowLimit = random.nextInt(size);
            randomColumnLimit = random.nextInt(size);
            System.out.println("Row : " + randomRowLimit);
            System.out.println("Column : " + randomColumnLimit);
            button.setText("");
            this.button[randomRowLimit][randomColumnLimit].setText("X");            
        }
        else
        {
            JOptionPane.showMessageDialog(this, "Please Click on X Mark to follow it.", "Small Game : ", JOptionPane.ERROR_MESSAGE);
        }
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new RadioSelection();
            }
        });
    }
}
person nIcE cOw    schedule 07.03.2012
comment
, большое спасибо за это. Это то, что мне действительно нужно. Как я могу отблагодарить вас за это? Спасибо! - person shielomarie; 07.03.2012
comment
@shielomarie: добро пожаловать и продолжайте улыбаться :-) - person nIcE cOw; 07.03.2012
comment
, для этого кода я собираюсь добавить еще один переключатель для кнопок 5x5. Большое спасибо! Вот моя улыбка ^-^ - person shielomarie; 07.03.2012
comment
хехе :-), это действительно приятно. - person nIcE cOw; 07.03.2012
comment
Дополнительные вопросы по кодам. Для сценария нажимается радиокнопка размером 3x3, после чего на выходе будут отображаться 9 кнопок. Если вы нажмете кнопку из 9 кнопок, появится окно сообщения «поймай мышь!» если вы нажмете на кнопку с x, то x переместится на другую кнопку случайным образом. Есть ли смысл здесь? Просто хочу знать, возможно ли это? Заранее спасибо!! - person shielomarie; 07.03.2012
comment
@shielomarie: Пожалуйста, посмотрите этот код сейчас, это то, что вы хотите? - person nIcE cOw; 07.03.2012
comment
Ты гений! это тот, кого я искал. я не знаю, как тебя отблагодарить! Большое вам спасибо!! Очень ценю ваши усилия по кодированию. Спасибо!! - person shielomarie; 07.03.2012
comment
Это очень мило с твоей стороны. Думающий ум — это ум гения. Так что и ты тоже гений :-) Кто знает, что ты еще сотворишь в будущем :-) - person nIcE cOw; 07.03.2012
comment
сэр, я не могу найти, как запустить это? revalidate имеет подчеркивание. :( - person shielomarie; 08.03.2012
comment
вау. это работает. я меняю revalidate(); сделать недействительным (); но когда я нажимаю радиокнопку, кнопки не выходят. может быть, потому что размер кадра не объявлен ... чтобы иметь возможность видеть кнопки сетки, пользователь должен настроить сторону кадра. это не автомат? должно быть, когда радиокнопка нажата (например, 3x3), 9 кнопок появятся даже без настройки рамки. .Спасибо, в любом случае! - person shielomarie; 08.03.2012
comment
@shielomarie: Пожалуйста, прочитайте комментарии в моей прикрепленной программе в моем ответе, если ваш JDK is 1.6 or lower, то revalidate() не будет работать, вы должны использовать frameObject.getContentPane().revalidate();.revalidate(); для JDK 1.7 или выше. Как это работало раньше? Попробуйте еще раз скопировать этот код и вставить его в конце. На моем конце работает нормально. - person nIcE cOw; 08.03.2012
comment
@shielomarie: Никогда не используйте invalidate(), это полностью противоположно по смыслу revalidate(), мы используем revalidate() для отмены invalidate(). LOL, и вы намеренно используете invalidate(). Если ничего не работает, отредактируйте свой вопрос с кодом, который вы пытаетесь :-) - person nIcE cOw; 08.03.2012
comment
@Gagandeep ››invalidate(); вот работает, сэр .. код, который вы мне даете, работает, хотя при нажатии радиокнопки кнопки появляются, если рамка настроена. - person shielomarie; 08.03.2012

Я не уверен, что понимаю вопрос или код, но я ожидаю увидеть ActionListener на кнопке 3x3, который создаст массив экземпляров JRadioButton, используя метод, подобный этому:

private JRadioButton [][] createRadioButtonArray(int squareSize) {
    JRadioButton [][] arrayOfButtons = new JRadioButton[squareSize][squareSize];
    for (int i = 0; i < squareSize; ++i) {
        for (int j = 0; j < squareSize; ++j) {
            arrayOfButtons[i][j] = new JRadioButton("button" + i + "," + j,false);
        }
    }
    return arrayOfButtons;
}
person duffymo    schedule 07.03.2012
comment
Да, это то, что я ищу. спасибо за помощь. Извините, если вы не можете понять мой вопрос, я не очень хорошо говорю по-английски. Хм, что с внутренним квадратом? - person shielomarie; 07.03.2012
comment
Вы имеете в виду квадратный размер? Это размер массива: 3 для вашего случая 3x3; 4 для вашего случая 4x4; и т. д. Я бы предпочел, чтобы вы приняли ответ на вашу благодарность. - person duffymo; 07.03.2012
comment
Что такое импорт? Необходимость в этом приложении? Большое спасибо! - person shielomarie; 07.03.2012
comment
Извините, я не пишу ваше приложение для вас. Вы уже импортируете то, что вам нужно для этого метода. - person duffymo; 07.03.2012
comment
Я знаю. Я имею в виду импорт, я должен поставить import javax.awt.*; - person shielomarie; 07.03.2012
comment
Я знаю, что Вы имеете ввиду. Нет, вы не должны использовать * в импорте. Вы должны просто импортировать JRadioButton для метода, который я написал. Убедитесь, что вы понимаете, что делает импорт. Он просто сохраняет нажатия клавиш, не более того. - person duffymo; 07.03.2012
comment
Я понимаю, что делает импорт. Мне просто трудно думать о том, как показать массив кнопок при нажатии переключателя. - person shielomarie; 07.03.2012
comment
Удачи - примите этот ответ, если он поможет. Я закончил с вашим вопросом, тяжелое время или нет. - person duffymo; 07.03.2012
comment
@duffymo +1, возможно, причина для реализации ButtonGroup - person mKorbel; 07.03.2012
comment
Как я могу закрыть этот вопрос? - person shielomarie; 07.03.2012
comment
@shielomarie, почему вы должны проголосовать и принять эта тема - person mKorbel; 07.03.2012
comment
Дополнительные вопросы по кодам. Для сценария нажимается радиокнопка размером 3x3, после чего на выходе будут отображаться 9 кнопок. Если вы нажмете кнопку из 9 кнопок, появится окно сообщения «поймай мышь!» если вы нажмете на кнопку с x, то x переместится на другую кнопку случайным образом. Есть ли смысл здесь? Просто хочу знать, возможно ли это? Заранее спасибо!! - person shielomarie; 07.03.2012
comment
Поместите его в класс по вашему выбору и запустите его. - person duffymo; 08.03.2012
comment
когда я ставлю этот, выходит фатальная ошибка, и он даже не запускается. - person shielomarie; 08.03.2012