#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.