Можно ли создать панель с классом слева и справа?

avatar
The wandering student
9 августа 2021 в 05:09
90
1
0

Я практиковал свой код с помощью Java Swing и неплохо научился контролировать, где размещать некоторые элементы, такие как метки и/или кнопки, но мне интересно, можете ли вы сделать то же самое с классами? У меня есть просто простой класс с достаточным количеством кода, чтобы поместить в него кнопку, и все, что я пытаюсь создать экземпляр класса, а затем контролировать его, чтобы поместить на левую и правую сторону, но когда я это делаю, все, что он делает это создать два отдельных окна с кнопкой посередине и все. Я что-то не так делаю, или нельзя так же делать занятия?

Код:

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

public class Fun extends JFrame
{
    private final int WIDTH = 500;
    private final int HEIGHT = 400;

    public Fun()
    {
        setTitle("Fun Management");
        setSize(WIDTH, HEIGHT);
        
        BuildPanel west = new BuildPanel(); /// BuildPanel is the name of the class that has just a button in it. 
        BuildPanel east = new BuildPanel(); /// 
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        add(west, BorderLayout.WEST); /// I am doing the same thing with the instances as I would with buttons or labesl
        add(east, BorderLayout.EAST);
        
        setVisible(true);
    }
    
    public static void main(String[] args)
    {
        new Fun();
    }
}
Источник
markspace
9 августа 2021 в 05:23
1

Этот метод add() принимает тип Component, поэтому, если BuildPanel наследуется от компонента, вы можете сделать это. Однако обычно GUI отделяется от классов "программной логики", поэтому будьте осторожны при расширении классов GUI, подобных этому. Для разделения вещей см. «MVC» en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

akortex
9 августа 2021 в 06:36
0

Можно ли поделиться кодом BuildPanel?

Ответы (1)

avatar
Gilbert Le Blanc
9 августа 2021 в 12:43
3

Я взял ваш код и создал следующий графический интерфейс.

Fun Management

У Oracle есть отличное руководство Создание графического интерфейса пользователя с помощью Swing, в котором показано, как создавать графические интерфейсы Swing. Пропустите раздел Netbeans.

Всегда запускайте приложение Swing с вызова метода SwingUtilities invokeLater. Этот метод гарантирует, что ваши компоненты Swing будут созданы и выполнены в потоке отправки событий.

.

Использовать компоненты Swing. Не расширяйте компонент Swing, если вы не хотите переопределить один или несколько методов компонента.

Методы JFrame должны вызываться в определенном порядке. Это порядок, который я рекомендую для большинства приложений Swing. Используйте метод JFrame pack и дайте компонентам размер JFrame.

Я создал класс BuildPanel для построения класса JPanel. Для этого есть веские причины, но будьте осторожны. Вы должны управлять каждым экземпляром класса, который вы создаете. Например, что, если вы хотите, чтобы текст двух кнопок был разным? Что, если вы хотите назначить два разных класса ActionListener, по одному для каждой кнопки?

Вот полный исполняемый код. Я сделал класс BuildPanel внутренним классом, поэтому я могу опубликовать код как один блок.

import java.awt.BorderLayout;

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

public class TwoPanelExample implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new TwoPanelExample());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Fun Management");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        BuildPanel west = new BuildPanel(); 
        BuildPanel east = new BuildPanel(); 
        
        frame.add(west.getPanel(), BorderLayout.WEST);
        frame.add(east.getPanel(), BorderLayout.EAST);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    public class BuildPanel {
        
        private final JPanel panel;
        
        public BuildPanel() {
            this.panel = createMainPanel();
        }
        
        private JPanel createMainPanel() {
            JPanel panel = new JPanel();
            panel.setBorder(BorderFactory.createEmptyBorder(5, 30, 5, 30));
            
            JButton button = new JButton("Click Me");
            panel.add(button);
            
            return panel;
        }

        public JPanel getPanel() {
            return panel;
        }
        
        
    }

}