JFrame в іншому JFrame

У мене є шахи. Я написав 3 класи. 1-е, якщо для гри. (шахівниця, шматки тощо) І ще один для меню. (кнопки, як новий, відкритий, встановлений час)

Обидва вони використовують JFrame.

Я хотів би поставити обидві класи, згадані вище, у 3-й клас. Наприклад, вікно гри буде ліворуч, а меню - справа. Третій клас також покаже ціле додаток у JFrame.

Як це зробити?

3
Ви не можете помістити один JFrame в інший.
додано Автор Code-Apprentice, джерело
Ви не можете помістити один JFrame в інший.
додано Автор Code-Apprentice, джерело
Ви не можете помістити один JFrame в інший.
додано Автор Code-Apprentice, джерело
Змініть свій дизайн так, щоб вміст вікна Game містився на JPanel , а меню знаходиться на іншому JPanel . Таким чином, ви можете розгорнути їх там, де ви хочете ...
додано Автор MadProgrammer, джерело
Змініть свій дизайн так, щоб вміст вікна Game містився на JPanel , а меню знаходиться на іншому JPanel . Таким чином, ви можете розгорнути їх там, де ви хочете ...
додано Автор MadProgrammer, джерело

9 Відповіді

Ви не можете помістити один JFrame в інший. У вас є пара варіантів дизайну тут. Ви можете змінити JFrames на JPanels. Це, мабуть, найпростіша зміна. З іншого боку, ви можете переглянути внутрішні фрейми .

12
додано
+1, а також ви змінили своє ім'я! : O
додано Автор Doorknob, джерело

Ви не можете помістити один JFrame в інший. У вас є пара варіантів дизайну тут. Ви можете змінити JFrames на JPanels. Це, мабуть, найпростіша зміна. З іншого боку, ви можете переглянути внутрішні фрейми .

12
додано
+1, а також ви змінили своє ім'я! : O
додано Автор Doorknob, джерело

Я думаю, це те, що ви хочете зробити.

public class OuterFrame extends JFrame {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    OuterFrame outerFrame = new OuterFrame();
                    outerFrame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public OuterFrame() {
        JFrame innerFrame = new JFrame();
        innerFrame.setVisible(true);
    }    
}

У вас є MainFrame (OuterFrame), і ви створите його. Але, ви створюєте JFrame всередині цієї MainFrame. Це не найкраща річ, але це, безумовно, спосіб відкриття "JFrame всередині іншого". Це дасть вам два "вікна" на екрані. Ви можете створити безліч JFrames всередині MainFrame.

1
додано

Ви можете використовувати JPanels для цього. Це просто так ... використовуйте JFrame для головного вікна, а для елементів меню використовуйте JPanel всередині нього. Пошук навчальних програм з використанням JPanel.

1
додано

Ви можете використовувати JPanels для цього. Це просто так ... використовуйте JFrame для головного вікна, а для елементів меню використовуйте JPanel всередині нього. Пошук навчальних програм з використанням JPanel.

1
додано

Ви можете використовувати JPanels для цього. Це просто так ... використовуйте JFrame для головного вікна, а для елементів меню використовуйте JPanel всередині нього. Пошук навчальних програм з використанням JPanel.

1
додано

Найкраще зробити це, щоб залишити зовнішню рамку так, як вона є, і змінити внутрішній вміст на JPanels. Коли я писав шахи, у мене була зовнішня рамка, яка розширила JFrame, а внутрішня панель, що розширила JPanel, на якій я розмістив плату. Сама дошка складалася з 64 JButtons.

З огляду на ваш опис, я думаю, що це буде гарною відправною точкою:

package data_structures;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Chess extends JFrame implements ActionListener {

    private JButton[][] tiles; 

    public Chess() {

        setTitle("Chess");
        setSize(500, 500);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setVisible(true);

        setLayout(new BorderLayout());

        JPanel board = new JPanel();

        board.setLayout(new GridLayout(8, 8));

        tiles = new JButton[8][8];

        for(int y = 0; y < tiles.length; y++) {

            for(int x = 0; x < tiles[y].length; x++) {

                tiles[x][y] = new JButton();

                tiles[x][y].setActionCommand(x + " " + y);
                tiles[x][y].addActionListener(this);

                board.add(tiles[x][y]);
            }
        }

        add(board, BorderLayout.CENTER);

        JPanel options = new JPanel();
        options.setLayout(new GridLayout(1, 3));

        JButton newGame = new JButton("New");
        newGame.addActionListener(this);

        options.add(newGame);

        JButton openGame = new JButton("Open");
        openGame.addActionListener(this);

        options.add(openGame);

        JButton setTime = new JButton("Set Time");
        setTime.addActionListener(this);

        options.add(setTime);

        add(options, BorderLayout.SOUTH);

        revalidate();
    }

    public void actionPerformed(ActionEvent event) {

        String command = event.getActionCommand();

        System.out.println(command);

        revalidate();
    }

    public static void main(String[] args) {
        new Chess();
    }
}

Крім того, слово попередження:

Повна реалізація логіки шахів дуже важка, незалежно від того, що ви робите для графіки.

Сподіваюся, це допомагає!

0
додано

Найкраще зробити це, щоб залишити зовнішню рамку так, як вона є, і змінити внутрішній вміст на JPanels. Коли я писав шахи, у мене була зовнішня рамка, яка розширила JFrame, а внутрішня панель, що розширила JPanel, на якій я розмістив плату. Сама дошка складалася з 64 JButtons.

З огляду на ваш опис, я думаю, що це буде гарною відправною точкою:

package data_structures;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Chess extends JFrame implements ActionListener {

    private JButton[][] tiles; 

    public Chess() {

        setTitle("Chess");
        setSize(500, 500);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setVisible(true);

        setLayout(new BorderLayout());

        JPanel board = new JPanel();

        board.setLayout(new GridLayout(8, 8));

        tiles = new JButton[8][8];

        for(int y = 0; y < tiles.length; y++) {

            for(int x = 0; x < tiles[y].length; x++) {

                tiles[x][y] = new JButton();

                tiles[x][y].setActionCommand(x + " " + y);
                tiles[x][y].addActionListener(this);

                board.add(tiles[x][y]);
            }
        }

        add(board, BorderLayout.CENTER);

        JPanel options = new JPanel();
        options.setLayout(new GridLayout(1, 3));

        JButton newGame = new JButton("New");
        newGame.addActionListener(this);

        options.add(newGame);

        JButton openGame = new JButton("Open");
        openGame.addActionListener(this);

        options.add(openGame);

        JButton setTime = new JButton("Set Time");
        setTime.addActionListener(this);

        options.add(setTime);

        add(options, BorderLayout.SOUTH);

        revalidate();
    }

    public void actionPerformed(ActionEvent event) {

        String command = event.getActionCommand();

        System.out.println(command);

        revalidate();
    }

    public static void main(String[] args) {
        new Chess();
    }
}

Крім того, слово попередження:

Повна реалізація логіки шахів дуже важка, незалежно від того, що ви робите для графіки.

Сподіваюся, це допомагає!

0
додано

Найкраще зробити це, щоб залишити зовнішню рамку так, як вона є, і змінити внутрішній вміст на JPanels. Коли я писав шахи, у мене була зовнішня рамка, яка розширила JFrame, а внутрішня панель, що розширила JPanel, на якій я розмістив плату. Сама дошка складалася з 64 JButtons.

З огляду на ваш опис, я думаю, що це буде гарною відправною точкою:

package data_structures;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Chess extends JFrame implements ActionListener {

    private JButton[][] tiles; 

    public Chess() {

        setTitle("Chess");
        setSize(500, 500);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setVisible(true);

        setLayout(new BorderLayout());

        JPanel board = new JPanel();

        board.setLayout(new GridLayout(8, 8));

        tiles = new JButton[8][8];

        for(int y = 0; y < tiles.length; y++) {

            for(int x = 0; x < tiles[y].length; x++) {

                tiles[x][y] = new JButton();

                tiles[x][y].setActionCommand(x + " " + y);
                tiles[x][y].addActionListener(this);

                board.add(tiles[x][y]);
            }
        }

        add(board, BorderLayout.CENTER);

        JPanel options = new JPanel();
        options.setLayout(new GridLayout(1, 3));

        JButton newGame = new JButton("New");
        newGame.addActionListener(this);

        options.add(newGame);

        JButton openGame = new JButton("Open");
        openGame.addActionListener(this);

        options.add(openGame);

        JButton setTime = new JButton("Set Time");
        setTime.addActionListener(this);

        options.add(setTime);

        add(options, BorderLayout.SOUTH);

        revalidate();
    }

    public void actionPerformed(ActionEvent event) {

        String command = event.getActionCommand();

        System.out.println(command);

        revalidate();
    }

    public static void main(String[] args) {
        new Chess();
    }
}

Крім того, слово попередження:

Повна реалізація логіки шахів дуже важка, незалежно від того, що ви робите для графіки.

Сподіваюся, це допомагає!

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників