【问题标题】:How to set a JToolBar to the size of the frame如何将 JToolBar 设置为框架的大小
【发布时间】:2021-03-15 05:34:40
【问题描述】:

我正在为我正在开发的音乐跟踪器制作用户界面,并且我已经设置了一些基础知识。我是用户界面的新手,所以我还没有弄清楚关于摇摆图形的所有内容。

我现在最大的问题是我无法正确调整工具栏的大小,因此它甚至不会出现。 如何将其大小设置为始终为 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;
    }
}

【问题讨论】:

  • 这个应用程序的大小和位置。在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); 将实现相同的效果。

标签: java swing layout-manager gridbaglayout jtoolbar


【解决方案1】:

不要使用GridBagLayout,而是使用更简单的布局并使用辅助JPanels 嵌套它们。要继续使用GridBagLayout,尤其是作为新手,我建议使用图形界面来处理约束以使其恰到好处(NetBeans 有一个不错的GridBagLayout 图形编辑器和代码生成器)。

我建议使用BorderLayout,并将工具栏放在顶部(它会自动拉伸到全宽):

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

在您的情况下,您似乎忘记将JFrame 的布局设置为GridBagLayout - 但即便如此,根据我的经验,您应该更喜欢嵌套JPanels,而不是将所有界面元素添加到相同的组件。使用单独的 JPanel 可以更轻松地进行布局、测试并提供灵活性,如果您想更改总体布局同时保持现有块的一致性。

【讨论】:

  • 这也适用于我的问题。当放入带有 JTable 的 JPanel 时,我希望工具栏保持其最小高度(仅比其封闭的按钮大一点)。工具栏只有它需要的高度,而 JTable 占据了 JPanel 的其余部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 2011-05-22
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多