JLabel & JButton setPreferredSize не работает должным образом - PullRequest
0 голосов
/ 15 октября 2018

Я создаю графический калькулятор Java.Пользовательский интерфейс сложен, и я делаю это, используя Layouts вместо перетаскивания.Все работает нормально, кроме

1. mode_error_label.setPreferredSize(new Dimension(46, 55)); 2. backButton.setPreferredSize(new Dimension(45, 55));

Почему высота не установлена ​​на 55?

Чего мне не хватает?

Посмотрите на верхний левый и верхний правый угол изображения.

Мой результат:

https://i.stack.imgur.com/5Uey8.jpg

Желаемый результат:

https://i.stack.imgur.com/eoDwk.jpg

public class CalculatorViewController extends JPanel {

private JTextField display1;
private JTextField display2;
private JLabel mode_error_label;
private JButton dotButton;

public CalculatorViewController() {
    this.setLayout(new BorderLayout());
    this.setBorder(BorderFactory.createMatteBorder(5, 5, 5, 5, Color.BLACK));

    mode_error_label = new JLabel("F", JLabel.CENTER);
    mode_error_label.setPreferredSize(new Dimension(46, 55));
    mode_error_label.setBackground(Color.YELLOW);
    mode_error_label.setOpaque(true);
    mode_error_label.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 5, Color.BLACK));

    JButton backButton = new JButton(Character.toString('\u21DA'));
    backButton.setPreferredSize(new Dimension(45, 55));
    backButton.setBackground(Color.YELLOW);
    backButton.setBorder(BorderFactory.createMatteBorder(0, 5, 0, 0, Color.BLACK));
    backButton.setToolTipText("Backspace (Alt-B)");

    display1 = new JTextField(16);
    display1.setEditable(false);
    display1.setHorizontalAlignment(JTextField.RIGHT);
    display1.setBackground(Color.WHITE);
    display1.setBorder(BorderFactory.createEmptyBorder());

    display2 = new JTextField(16);
    display2.setEditable(false);
    display2.setHorizontalAlignment(JTextField.RIGHT);
    display2.setBackground(Color.WHITE);
    display2.setBorder(BorderFactory.createEmptyBorder());
    display2.setText("0.0");

    Box displayBox = Box.createVerticalBox();
    displayBox.add(display1);
    displayBox.add(display2);

    Box upperBox = Box.createHorizontalBox();
    upperBox.add(mode_error_label);
    upperBox.add(displayBox);
    upperBox.add(backButton);
    upperBox.setBorder(BorderFactory.createMatteBorder(0, 0, 5, 0, Color.black));

    JCheckBox modeCheckBox = new JCheckBox("int");
    modeCheckBox.setPreferredSize(new Dimension(40, 0));
    modeCheckBox.setBackground(Color.green);

    JRadioButton _0RadioButton = new JRadioButton(".0", false);
    _0RadioButton.setBackground(Color.YELLOW);
    JRadioButton _00RadioButton = new JRadioButton(".00", true);
    _00RadioButton.setBackground(Color.YELLOW);
    JRadioButton sciRadioButton = new JRadioButton("Sci", false);
    sciRadioButton.setBackground(Color.YELLOW);

    ButtonGroup radioButtonGroup = new ButtonGroup();
    radioButtonGroup.add(_0RadioButton);
    radioButtonGroup.add(_00RadioButton);
    radioButtonGroup.add(sciRadioButton);


    Box lowerBox = Box.createHorizontalBox();
    lowerBox.add(modeCheckBox);
    lowerBox.add(Box.createGlue());
    lowerBox.add(_0RadioButton);
    lowerBox.add(_00RadioButton);
    lowerBox.add(sciRadioButton);
    lowerBox.setBackground(Color.BLACK);
    lowerBox.setOpaque(true);
    lowerBox.setBorder(BorderFactory.createMatteBorder(5, 0, 5, 0, Color.black));

    JPanel lowerPanel = new JPanel();
    lowerPanel.add(lowerBox);
    lowerPanel.setBackground(Color.BLACK);
    lowerPanel.setOpaque(true);
    lowerPanel.setBorder(BorderFactory.createEmptyBorder());

    Box superBox = Box.createVerticalBox();
    superBox.add(upperBox);
    superBox.add(lowerBox);

    this.add(superBox, BorderLayout.PAGE_START);
}
}

Я искал это, но не нашел удачи.Любая помощь будет оценена.Спасибо

1 Ответ

0 голосов
/ 15 октября 2018

Для верхней панели, где у вас есть кнопка «Назад» и метка, установите макет контейнера как макет границы.Граница макета должна изменить размер компонента в своем контейнере.Или вы можете опубликовать код, который показывает проблему, и мы можем попытаться решить вашу проблему.Удачи.

public class CalculatorViewController extends JPanel {

private JTextField display1;
private JTextField display2;
private JLabel mode_error_label;
private JButton dotButton;
private JPanel topPanel;

public CalculatorViewController() {
    this.setLayout(new BorderLayout());
    this.setBorder(BorderFactory.createMatteBorder(5, 5, 5, 5, Color.BLACK));

    mode_error_label = new JLabel("F", JLabel.CENTER);
    mode_error_label.setPreferredSize(new Dimension(46, 55));
    mode_error_label.setBackground(Color.YELLOW);
    mode_error_label.setOpaque(true);
    mode_error_label.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 5, Color.BLACK));

    JButton backButton = new JButton(Character.toString('\u21DA'));
    backButton.setPreferredSize(new Dimension(45, 55));
    backButton.setBackground(Color.YELLOW);
    backButton.setBorder(BorderFactory.createMatteBorder(0, 5, 0, 0, Color.BLACK));
    backButton.setToolTipText("Backspace (Alt-B)");

    display1 = new JTextField(16);
    display1.setEditable(false);
    display1.setHorizontalAlignment(JTextField.RIGHT);
    display1.setBackground(Color.WHITE);
    display1.setBorder(BorderFactory.createEmptyBorder());

    display2 = new JTextField(16);
    display2.setEditable(false);
    display2.setHorizontalAlignment(JTextField.RIGHT);
    display2.setBackground(Color.WHITE);
    display2.setBorder(BorderFactory.createEmptyBorder());
    display2.setText("0.0");

    Box displayBox = Box.createVerticalBox();
    displayBox.add(display1);
    displayBox.add(display2);

    Box upperBox = Box.createHorizontalBox();
    topPanel.add(mode_error_label, BorderLayout.WEST);
    topPanel.add(displayBox, BorderLayout.CENTER);
    topPanel.add(backButton, BorderLayout.EAST);

    upperBox.add(topPanel);
    upperBox.setBorder(BorderFactory.createMatteBorder(0, 0, 5, 0, Color.black));

    JCheckBox modeCheckBox = new JCheckBox("int");
    modeCheckBox.setPreferredSize(new Dimension(40, 0));
    modeCheckBox.setBackground(Color.green);

    JRadioButton _0RadioButton = new JRadioButton(".0", false);
    _0RadioButton.setBackground(Color.YELLOW);
    JRadioButton _00RadioButton = new JRadioButton(".00", true);
    _00RadioButton.setBackground(Color.YELLOW);
    JRadioButton sciRadioButton = new JRadioButton("Sci", false);
    sciRadioButton.setBackground(Color.YELLOW);

    ButtonGroup radioButtonGroup = new ButtonGroup();
    radioButtonGroup.add(_0RadioButton);
    radioButtonGroup.add(_00RadioButton);
    radioButtonGroup.add(sciRadioButton);


    Box lowerBox = Box.createHorizontalBox();
    lowerBox.add(modeCheckBox);
    lowerBox.add(Box.createGlue());
    lowerBox.add(_0RadioButton);
    lowerBox.add(_00RadioButton);
    lowerBox.add(sciRadioButton);
    lowerBox.setBackground(Color.BLACK);
    lowerBox.setOpaque(true);
    lowerBox.setBorder(BorderFactory.createMatteBorder(5, 0, 5, 0, Color.black));

    JPanel lowerPanel = new JPanel();
    lowerPanel.add(lowerBox);
    lowerPanel.setBackground(Color.BLACK);
    lowerPanel.setOpaque(true);
    lowerPanel.setBorder(BorderFactory.createEmptyBorder());

    Box superBox = Box.createVerticalBox();
    superBox.add(upperBox);
    superBox.add(lowerBox);

    this.add(superBox, BorderLayout.PAGE_START);
}

}

...