Проблема BorderLayout с JSplitPane после добавления JToolbar (Java)
Проблема:
Мой макет программы в порядке, как показано ниже, прежде чем я добавлю JToolbar в BorderLayout.PAGE_START
Вот скриншот перед добавлением JToolbar:
Вот как это выглядело после добавления JToolbar:
Могу ли я знать, что я сделал не так?
Вот код, который я использовал:
//Create the text pane and configure it.
textPane = new JTextPane();
-snipped code-
JScrollPane scrollPane = new JScrollPane(textPane);
scrollPane.setPreferredSize(new Dimension(300, 300));
//Create the text area for the status log and configure it.
changeLog = new JTextArea(5, 30);
changeLog.setEditable(false);
JScrollPane scrollPaneForLog = new JScrollPane(changeLog);
//Create a split pane for the change log and the text area.
JSplitPane splitPane = new JSplitPane(
JSplitPane.VERTICAL_SPLIT,
scrollPane, scrollPaneForLog);
splitPane.setOneTouchExpandable(true);
//Create the status area.
JPanel statusPane = new JPanel(new GridLayout(1, 1));
CaretListenerLabel caretListenerLabel =
new CaretListenerLabel("Caret Status");
statusPane.add(caretListenerLabel);
//Create the toolbar
JToolBar toolBar = new JToolBar();
-snipped code-
//Add the components.
getContentPane().add(toolBar, BorderLayout.PAGE_START);
getContentPane().add(splitPane, BorderLayout.CENTER);
getContentPane().add(statusPane, BorderLayout.PAGE_END);
//Set up the menu bar.
actions = createActionTable(textPane);
JMenu editMenu = createEditMenu();
JMenu styleMenu = createStyleMenu();
JMenuBar mb = new JMenuBar();
mb.add(editMenu);
mb.add(styleMenu);
setJMenuBar(mb);
Пожалуйста, помогите, я новичок в GUI Building, и мне не хочется использовать Netbeans для перетаскивания интерфейса для меня... Спасибо заранее.
3 ответа
Вместо того, чтобы использовать setSize()
на JFrame
установите предпочтительный размер вашего центрального компонента, как вы делаете сейчас, и вызовите pack()
, который "заставляет это окно иметь размер, соответствующий предпочтительному размеру и разметке его подкомпонентов". Расширяя пример @Bragaadeesh,
public static void main(String[] args) {
TestFrame frame = new TestFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.build();
frame.pack();
frame.setVisible(true);
}
Затем измените на scrollPane.setPreferredSize(new Dimension(500, 300))
или же JTextArea changeLog = new JTextArea(10, 30)
чтобы увидеть разницу.
Я не знаю в чем проблема. Я попытался запустить его в своей системе, исправив проблемы с компиляцией. Вот код и скриншот.
import java.awt.*;
import javax.swing.*;
public class TestFrame extends JFrame{
public static void main(String[] args) {
TestFrame frame = new TestFrame();
frame.build();
frame.setVisible(true);
}
public void build(){
setSize(600,600);
//Create the text pane and configure it.
JTextPane textPane = new JTextPane();
JScrollPane scrollPane = new JScrollPane(textPane);
scrollPane.setPreferredSize(new Dimension(300, 300));
//Create the text area for the status log and configure it.
JTextArea changeLog = new JTextArea(5, 30);
changeLog.setEditable(false);
JScrollPane scrollPaneForLog = new JScrollPane(changeLog);
//Create a split pane for the change log and the text area.
JSplitPane splitPane = new JSplitPane(
JSplitPane.VERTICAL_SPLIT,
scrollPane, scrollPaneForLog);
splitPane.setOneTouchExpandable(true);
//Create the status area.
JPanel statusPane = new JPanel(new GridLayout(1, 1));
JLabel caretListenerLabel =
new JLabel("Caret Status");
statusPane.add(caretListenerLabel);
//Create the toolbar
JToolBar toolBar = new JToolBar();
toolBar.add(new JButton("Btn1"));
toolBar.add(new JButton("Btn2"));
toolBar.add(new JButton("Btn3"));
toolBar.add(new JButton("Btn4"));
//Add the components.
getContentPane().add(toolBar, BorderLayout.PAGE_START);
getContentPane().add(splitPane, BorderLayout.CENTER);
getContentPane().add(statusPane, BorderLayout.PAGE_END);
//Set up the menu bar.
JMenu editMenu = new JMenu("test");
JMenu styleMenu = new JMenu("test");
JMenuBar mb = new JMenuBar();
mb.add(editMenu);
mb.add(styleMenu);
setJMenuBar(mb);
}
}
РЕДАКТИРОВАТЬ: я понимаю, почему сейчас.
Я использовал Paint, чтобы дать мне приблизительную оценку пикселей, и раньше я не знал, что высчитывается высота от начала строки заголовка верхнего кадра! Так что в сумме получается ~= 504. Теперь я понял.
Поэтому в следующий раз, когда мне нужно будет приблизительно установить высоту, я думаю, что я буду использовать Paint.
Хм странно. Я должен измениться с:
//Display the window.
frame.setSize(640, 480);
в
//Display the window.
frame.setSize(640, 504);
Тогда только это работает.
Может кто-нибудь научить меня, как оценить или установить ширину / высоту для компонентов? Потому что изначально я хотел, чтобы это было 640,480
но видимо сейчас это нужно 640,504
,