Как растянуть JButton на всю высоту JPanel - PullRequest
0 голосов
/ 27 апреля 2019

Подводя итог моей проблеме, я разрабатываю интерфейс для приложения на Java.Я столкнулся с проблемой, с которой еще не сталкивался.Чтобы создать своего рода «панель навигации», я создал тонкий JPanel в верхней части JFrame.Затем я хотел добавить JButton для представления кнопки «домой», которая ведет к начальному содержанию приложения.Когда я сделал это и сделал ширину и высоту кнопки равной высоте панели, кнопка имела небольшой зазор примерно в 3 пикселя от верхней части панели.Я не знаю, почему это так, внутри панели нет другого элемента.Я не использую никакой компоновки, однако я пытался решить эту проблему с помощью FlowLayout, но ничего не изменилось.

Вот полный код интерфейса, я пометил панель меню красным цветом только для целей тестирования,Как мне избавиться от этого небольшого зазора на вершине?

package UserInterface;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Interface {

private JFrame frame;
private JPanel menu;
private JPanel content;

public JButton home;

public Interface() {

    Dimension dim = new Dimension(50, 50);

    frame = new JFrame();
    menu = new JPanel();
    content = new JPanel();

    frame.setSize(1600, 900);
    menu.setSize(1600, 50);
    content.setSize(1600, 850);

    frame.setTitle("Tierland");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocation(
            (int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2) - (frame.getWidth() / 2)),
            (int)((Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2) - (frame.getHeight() / 2))
    );

    frame.setSize(1600, 900);
    menu.setSize(1600, 50);
    content.setSize(1600, 850);

    menu.setBackground(Color.RED);

    home = new JButton();
    home.setPreferredSize(dim);
    home.setMinimumSize(dim);
    home.setMaximumSize(dim);
    home.setSize(dim);


    frame.add(menu);
    frame.add(content);

    frame.setVisible(true);
    menu.setVisible(true);
    content.setVisible(true);

}

}

1 Ответ

2 голосов
/ 27 апреля 2019

Я не использую макет,

Да, вы. По умолчанию JPanel использует FlowLayout.

однако я попытался решить эту проблему с помощью FlowLayout, но ничего не изменилось.

Это потому, что по умолчанию FlowLayout использует 5-пиксельный зазор вокруг любого компонента, добавляемого на панель.

Вы должны использовать:

menu.setLayout( new FlowLayout(...) );

Прочитайте API FlowLayout для соответствующего конструктора, который позволит вам использовать 0 для горизонтального и / или вертикального разрыва.

frame.add(menu);
frame.add(content);

Кроме того, по умолчанию панель содержимого фрейма использует BorderLayout, поэтому вы должны использовать:

frame.add(menu, BorderLayout.PAGE_START);
frame.add(content, BorderLayout.CENTER);

Вы не должны пытаться контролировать размер кнопки:

//home.setPreferredSize(dim);
//home.setMinimumSize(dim);
//home.setMaximumSize(dim);

Просто установите текст кнопки или добавьте значок к кнопке, и кнопка определит свой предпочтительный размер.

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

...