Jtabbedpane с использованием нескольких классов

Я новичок в java и создаю программу для создания окон. Мне интересно, возможно ли это при использовании Jtabbedpane и переключении между вкладками в окне программы, если я могу использовать actionlistener для получения содержимого из отдельного класса. Например, у меня есть программа с двумя вкладками и двумя классами, первая вкладка будет иметь код из одного класса, а вторая вкладка из второго класса.

Спасибо


person Preston    schedule 27.11.2012    source источник
comment
1) Что ты сделал до сих пор? 2) Используя оконный конструктор, вы никогда полностью не поймете свинг.   -  person Branislav Lazic    schedule 27.11.2012


Ответы (2)


Если вы хотите разделить свой код, который создает графический интерфейс, на несколько классов, вы можете использовать этот подход:

Это будет ваш основной класс, который будет содержать JTabbedPane:

import javax.swing.JFrame;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

public class Main {
    JFrame frame = new JFrame();
    JTabbedPane tabbedPane = new JTabbedPane();
    FirstPanel fp = new FirstPanel();
    SecondPanel sp = new SecondPanel();

    public Main() {
        tabbedPane.add("First", fp);
        tabbedPane.add("Second", sp);
        frame.getContentPane().add(tabbedPane);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(640, 480);
        // frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

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

}

Это будет ваш второй класс, который расширяет JPanel или какой-либо другой тип контейнера:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.JPanel;

public class FirstPanel extends JPanel{

    public void paintComponent(Graphics g){
        g.setColor(Color.BLACK);
        g.setFont(new Font("Verdana",Font.BOLD,16));
        g.drawString("Hello there", 20, 20);
    }
}

Пример третьего класса, который также расширяет JPanel:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class SecondPanel extends JPanel{
    JButton button = new JButton("Click me!");

    public SecondPanel() {
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                JOptionPane.showMessageDialog(null, "You just clicked button");
            }
        });
        add(button);
    }

    public void paintComponent(Graphics g){
        g.setColor(Color.BLACK);
        g.setFont(new Font("Verdana",Font.BOLD,16));
        g.drawString("Hello there again!", 20, 20);
    }
}

Снимок экрана:

введите здесь описание изображения

ИЗМЕНИТЬ:

Кроме того, вместо того, чтобы расширять классы с помощью JPanel, было бы разумно создать в этом классе только метод, который возвращает настроенный JPanel. Таким образом, ваш класс остается «открытым» для наследования.

person Branislav Lazic    schedule 27.11.2012
comment
Это очень полезно! Именно то, над чем я работаю. Большое спасибо, что написали пример для меня. - person Preston; 27.11.2012

Вы заявляете:

Мне интересно, возможно ли это при использовании Jtabbedpane и переключении между вкладками в окне программы, если я могу использовать actionlistener для получения содержимого из отдельного класса.

ActionListener не будет работать, если вы хотите прослушивать изменения на выбранной вкладке, поскольку это активируется только дочерними элементами класса AbstractButton. Вместо этого обратите внимание, что JTabbedPane использует SingleSelectionModel в качестве своей модели, и вы можете отслеживать изменения в ней с помощью ChangeListener. API и учебные пособия могут помочь заполнить детали.

Если, с другой стороны, вам интересно, можете ли вы использовать JButton/ActionListener в одном компоненте, удерживаемом вкладкой, и иметь действия, вызывающие изменения в другом компоненте, хранящемся на другой вкладке, тогда ответ, безусловно, даже если два представления созданные разными классами. Именно здесь на первый план выходит шаблон проектирования наблюдатель или слушатель. Для получения подробной информации по этому вопросу предоставьте более подробную информацию о вашей конкретной проблеме.

Также я полностью согласен с brano88 - не используйте программу построения окон, пока вы не будете хорошо знакомы и хорошо знакомы с основами библиотеки Swing.

person Hovercraft Full Of Eels    schedule 27.11.2012
comment
Спасибо, это очень помогает. Да, я бы предпочел не использовать конструктор окон, но мой инструктор назначает программы, которые нужно выполнять с помощью конструктора окон. - person Preston; 27.11.2012