Как использовать менеджер макетов в JTabbedPane? - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь сделать 3 вкладки, и в каждой вкладке у меня есть текстовое поле, несколько кнопок и флажков, а также большая текстовая область.

Проблема в том, что я пытаюсь использоватьGridBagLayout или GridLayout с JTabbedPane одновременно, либо ничего не отображается, либо все три вкладки помещаются в один маленький прямоугольник в центре.Я не знаю, сможем ли мы использовать это вместе?

Но я хотел бы использовать какую-то компоновку, чтобы установить текст в верхней части, затем в середине каждой вкладки используйте кнопки, а в нижней части вкладки есть JTextArea для вывода потока.

Вот мой код:

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.io.PrintStream;
import javax.swing.JTabbedPane;

public class FrameFinder extends JFrame  {
    private static final int FRAME_HEIGHT = 600;
    private static final int FRAME_WIDTH = 500;
    private final Font LARGE_FONT = new Font(Font.SERIF, Font.BOLD, 34);
    public static JTextField text;
    private JPanel panel;
    private JButton button;
    private JLabel label;
    private JMenuBar menubar;
    private KeyListener newkey;
    private JMenuItem exit;
    private JMenuItem about;
    private JTabbedPane jtap;
    private JTextArea textArea;
    static private final String newline = "\n";

    // constructor
    public FrameFinder(){
    }
    //creating constructor
    public FrameFinder(String str){
        createFrame(str);
        CreateTabbedPane();

    }

    // click listener
    private void addMenuListeners(){

        exit.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                exitActionPerformed();
            }
        });
        about.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
              //  aboutActionPerformed();
            }
        });
    }
    private void exitActionPerformed(){
        dispose();
    }


   //creating frame
    private void createFrame(String title) {
        setTitle(title);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(FRAME_WIDTH, FRAME_HEIGHT);
        setVisible(true);
        setResizable(false);
    }

        // here we create the tab bar
    public void CreateTabbedPane() {
      //  super(String.valueOf(new BorderLayout()));
        setTitle("Tabbed Pane");
        //setLayout(new GridLayout());
        jtap = new JTabbedPane();
        getContentPane().add(jtap);
        textArea = new JTextArea(50, 10);
        textArea.setEditable(false);
       // PrintStream printStream = new PrintStream(new CustomOutputStream(textArea));
        //JPanel controls = new JPanel();
        JPanel jp1 = new JPanel();
        JPanel jp2 = new JPanel();
        JPanel jp3 = new JPanel();


        setLayout(new GridBagLayout());
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.insets = new Insets(10, 10, 10, 10);
        constraints.anchor = GridBagConstraints.WEST;

        jp1.add(new JTextField("Find:", 20));
        jp1.add(new JButton("Search"));
        jp2.add(new JTextField("Directory path :", 20));
        jp2.add(new JButton("Browser "));
        jp1.add(new JCheckBox("match whole word."));
        jp1.add(new JCheckBox("Match case."));
        jp3.add(new JTextArea(50, 10));

        jp2.add(new JTextField("Find in folders:", 20));
        jp2.add(new JButton("Search"));
        jp2.add(new JTextField("Directory path :", 20));
        jp2.add(new JButton("Browser "));
        jp2.add(new JCheckBox("match whole word."));
        jp2.add(new JCheckBox("Match case."));
        jp3.add(new JTextArea(50, 10));

        jp3.add(new JTextField("Find in folders:", 20));
        jp3.add(new JButton("Search"));
        jp2.add(new JTextField("Directory path :", 20));
        jp2.add(new JButton("Browser "));
        jp3.add(new JCheckBox("match whole word."));
        jp3.add(new JCheckBox("Match case."));
        jp3.add(new JTextArea(50, 10));

        JLabel label1 = new JLabel();
        JLabel label2 = new JLabel();
        JLabel labe13 = new JLabel();
       // label2.setText("You are in area of Tab2");
        createFrame("Finder");
        jp1.add(label1);
        jp2.add(label2);
        jp3.add(labe13);


        jtap.addTab("Find ", jp1);
        jtap.addTab("Replace All in one file", jp2);
        jtap.addTab("Replace All  in Multi files",jp3);

    }

}

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вам не нужно устанавливать менеджер макетов в JFrame, потому что вы собираетесь добавить только один компонент: jTabPane.По умолчанию все компоненты являются контейнерами, но принимают только 1 компонент, если вы хотите добавить два или более компонентов, вам нужно установить менеджер компоновки.В этом случае вам не нужно устанавливать менеджер макета в Jframe, но вам нужно установить менеджер макета для каждой jpanel, который вы добавляете в качестве вкладки в jTabPane.Поскольку вы не настраиваете менеджер макетов на каждой jpanel, он будет отображать только 1 компонент, последний добавленный.

Я рекомендую вам использовать MigLayout , это просто и очень мощно.

0 голосов
/ 05 октября 2018
JPanel jp1 = new JPanel();
JPanel jp2 = new JPanel();
JPanel jp3 = new JPanel();


setLayout(new GridBagLayout());

Приведенный выше код устанавливает менеджер макета для фрейма, а это не то, что вы хотите сделать.

А менеджером макета по умолчанию для панели является FlowLayout (поскольку вы этого не делаетеукажите менеджер раскладки).

Вы хотите установить диспетчер раскладки для каждой панели:

JPanel jp1 = new JPanel( pick a layout manager);
JPanel jp2 = new JPanel( pick a layout manager);
JPanel jp3 = new JPanel( pick a layout manager);

//setLayout(new GridBagLayout());

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

Компоновка каждой вкладки полностью независима от других вкладок.Единственное отношение состоит в том, что все вкладки имеют одинаковое пространство, поэтому предпочтительный размер панели вкладок будет предпочтительным размером самой большой вкладки.

Но я хотел бы использовать какой-то вид компоновки для установкитекст, расположенный сверху, затем в середине каждой вкладки используйте кнопки, а внизу вкладки есть Jtextarea для вывода потока.Любая помощь будет оценена.Вот мой код:

Так что, возможно, вы начнете с BorderLayout для главной панели, чтобы добавить на вкладку.Затем вы можете создать другие панели для отображения компонента в PAGE_START, CENTER, PAGE_END BorderLayout.Прочтите учебник по Swing в Layout Manager , где приведены примеры, с которых можно начать.

Редактировать:

Следуя моему предложению сверху, вы можете сделать что-то вроде:

JPanel top = new JPanel( new GridLayout(0, 3) );
top.add( new JLabel("Label1") );
top.add( new JLabel("Label2") );
top.add( new JLabel("Label3") );

JTextArea textArea = new JTextArea(5, 30);

JPanel bottom = new JPanel( new GridLayout(0, 2) );
bottom.add( new JButton("Button1") );
bottom.add( new JButton("Button2") );

JPanel tab1 = new JPanel( new BorderLayout() );
tab1.add(top, BorderLayout.PAGE_START);
tab1.add(new JScrollPane(textArea), BorderLayout.CENTER);
tab1.add(bottom, BorderLayout.PAGE_END);

JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.addTab("Tab1", tab1);

frame.add(tabbedPane);
...