Как установить JToolBar на размер фрейма

#java #swing #layout-manager #gridbaglayout #jtoolbar

#java #качать #макет-менеджер #gridbaglayout #jtoolbar

Вопрос:

Я создаю пользовательский интерфейс для музыкального трекера, над которым я работаю, и у меня есть некоторые основы. Я новичок в пользовательских интерфейсах, поэтому я еще не разобрался во всем, что касается графики swing.

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

MainInterface инициализируется в основном классе.

 package userInterface;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.JTree;

/**
 *
 * @author Edward Jenkins
 */
public class MainInterface extends JFrame {
    
    // constants
    public static final int DEFAULT_WINDOW_WIDTH = 1080;
    public static final int DEFAULT_WINDOW_HEIGHT = 720;    
    
    // instance variables
    int screenWidth;
    int screenHeight;
    JMenuBar menuBar;
    JMenu fileMenu, editMenu, toolsMenu;
    GridBagLayout gbl;
    GridBagConstraints gbc;
    JTree tree;
    JTable trackerTable;
    JScrollPane tableScroll;
    Container toolBarContainer;
    JToolBar toolBar;
    JButton saveButton, loadButton, pauseButton, stopButton, backPatternButton, 
            forthPatternButton, playButton, recordButton, repeatSongButton;
    JTabbedPane tabbedPane;
    
    int numberOfChannels;
    
    // constructor
    public MainInterface() {
        getScreenSize();
        this.setTitle("Synth Tracker 1.0");
        this.setLayout(gbl);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setBounds((int)(screenWidth / 2) - (int)(DEFAULT_WINDOW_WIDTH / 2),
                (int)(screenHeight / 2) - (int)(DEFAULT_WINDOW_HEIGHT / 2),
                DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT);
        addComponents();
        this.setVisible(true);
    }
    
    // get screen size
    private void getScreenSize() {
        GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment()
                .getDefaultScreenDevice();
        screenWidth = gd.getDisplayMode().getWidth();
        screenHeight = gd.getDisplayMode().getHeight();
    }
    
    // set all components
    private void addComponents() {
        
        //Menu bar and its options
        menuBar = new JMenuBar();
        fileMenu = new JMenu("File");
        editMenu = new JMenu("Edit");
        toolsMenu = new JMenu("Tools");
        
        // add menues to menuBar
        menuBar.add(fileMenu);
        menuBar.add(editMenu);
        menuBar.add(toolsMenu);
        this.setJMenuBar(menuBar);
        
        // set the grid and constraint
        gbl = new GridBagLayout();
        gbc = new GridBagConstraints();
        
        // set the row 1 of the grid
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 2;
        
        // set toolbar container
        toolBarContainer = this.getContentPane();
        
        // set the toolbar
        toolBar = new JToolBar();
        toolBar.setRollover(true);
        toolBar.setFloatable(false);
        
        // set the buttons in the toolbar
        saveButton = new JButton();
        saveButton.setIcon(
                new ImageIcon("src/userInterface/icons/save_icon.png"));
        saveButton.setToolTipText("Save"); 
        
        toolBar.add(saveButton);

        add(toolBar, gbc);
        
    }
    
    public void setNumberOfChannels(int numberOfChannels) {
        this.numberOfChannels = numberOfChannels;
    }
}
 

Комментарии:

1. Размеры и позиционирование этого приложения. начинают идти не так public static final int DEFAULT_WINDOW_WIDTH = 1080; .. Если пользовательскому компоненту требуется определенный размер или соотношение сторон, переопределите метод, чтобы обеспечить этот предпочтительный размер, добавьте все компоненты вокруг него, затем упакуйте фрейм по размеру. Затем мы приходим к … this.setBounds((int)(screenWidth / 2) - (int)(DEFAULT_WINDOW_WIDTH / 2), (int)(screenHeight / 2) - (int)(DEFAULT_WINDOW_HEIGHT / 2), DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT); . С другой стороны, this.setLocationRelativeTo(null); будет достигнуто то же самое.

Ответ №1:

Вместо a GridBagLayout используйте более простые макеты и вложите их с помощью вспомогательных JPanel s . Чтобы продолжить использование GridBagLayout , особенно новичкам, я рекомендую использовать графический интерфейс, чтобы поиграть с ограничениями, чтобы получить их в самый раз (NetBeans имеет хороший GridBagLayout графический редактор и генератор кода).

Я бы рекомендовал использовать a BorderLayout и поместить панель инструментов вверху (она автоматически растянется на всю ширину).:

 // within addComponents
setLayout(new BorderLayout());
getContentPane().add(toolBar, BorderLayout.NORTH);
 

В вашем случае вы, похоже, забыли установить макет JFrame в a GridBagLayout — но даже в этом случае, по моему опыту, вы должны предпочесть вложение JPanel s добавлению всех элементов интерфейса в один и тот же компонент. Использование отдельных JPanels упрощает компоновку, тестирование и обеспечивает гибкость, если вы когда-нибудь захотите изменить общую компоновку, сохраняя при этом согласованность существующих блоков.

Комментарии:

1. Это также сработало для моей проблемы. Я хотел, чтобы панель инструментов сохраняла свою минимальную высоту (чуть больше, чем ее вложенные кнопки) при размещении в JPanel с JTable. Панель инструментов имеет только ту высоту, которая необходима, а JTable занимает остальную часть JPanel.