Box Layout премества компоненти, подравняване

Бих искал да създам следния GUI:

https://www.dropbox.com/s/ebm057jfevwe532/result.png?dl=0

Ето моят код:

public class TypingTutor extends JFrame{
private JPanel mainPanel;
private JPanel[] keyboardPanel;
private JLabel instructionsLabel;
private JLabel noteLabel;
private JTextArea typingTextArea;
private JButton[] buttonKeysFirstRow;
private JButton[] buttonKeysSecondRow;
private JButton[] buttonKeysThirdRow;
private JButton[] buttonKeysFourthRow;
private JButton[] buttonKeysFifthRow;
//TypingTutor no-argument constructor
public TypingTutor(){
    super("Typing Application");
    setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));

    instructionsLabel = new JLabel("Type some text using your keyboard. The keys you press " +
        "will be highlighted and the text will be displayed.");
    noteLabel = new JLabel("Note: Clicking the buttons with your mouse will not perform any " +
        "action.");
    add(instructionsLabel);
    add(noteLabel);

    typingTextArea = new JTextArea();
    add(typingTextArea);

    //each row represents each row in the keyboard
    buttonKeysFirstRow = new JButton[14];
    buttonKeysSecondRow = new JButton[13];
    buttonKeysThirdRow = new JButton[14];
    buttonKeysFourthRow = new JButton[12];
    buttonKeysFifthRow = new JButton[4];
    initializeKeys(1);
    initializeKeys(2);
    initializeKeys(3);
    initializeKeys(4);
    initializeKeys(5);
    Box[] keyboard = new Box[5];
    for(int i = 0; i < keyboard.length; i++){
        keyboard[i] = Box.createHorizontalBox();
        switch(i){
            case 0:
                for(int j = 0; j < buttonKeysFirstRow.length; j++){
                    keyboard[i].add(buttonKeysFirstRow[j]);
                } //end for
                break;
            case 1:
                for(int j = 0; j < buttonKeysSecondRow.length; j++){
                    keyboard[i].add(buttonKeysSecondRow[j]);
                } //end for
                break;
            case 2:
                for(int j = 0; j < buttonKeysThirdRow.length; j++){
                        keyboard[i].add(buttonKeysThirdRow[j]);
                } //end for
                break;
            case 3:
                for(int j = 0; j < buttonKeysFourthRow.length; j++){
                    keyboard[i].add(buttonKeysFourthRow[j]);
                } //end for
                break;
            case 4:
                for(int j = 0; j < buttonKeysFifthRow.length; j++){
                    keyboard[i].add(buttonKeysFifthRow[j]);
                } //end for
                break;
        } //end switch
        add(keyboard[i]);
    } //end for
} //end TypingTutor no-argument constructor

//initializes button keys with their values
private void initializeKeys(int keys){
    switch(keys){
        case 1:
            buttonKeysFirstRow[0] = new JButton("|\n°");
            buttonKeysFirstRow[1] = new JButton("1");
            buttonKeysFirstRow[2] = new JButton("2");
            buttonKeysFirstRow[3] = new JButton("3");
            buttonKeysFirstRow[4] = new JButton("4");
            buttonKeysFirstRow[5] = new JButton("5");
            buttonKeysFirstRow[6] = new JButton("6");
            buttonKeysFirstRow[7] = new JButton("7");
            buttonKeysFirstRow[8] = new JButton("8");
            buttonKeysFirstRow[9] = new JButton("9");
            buttonKeysFirstRow[10] = new JButton("0");
            buttonKeysFirstRow[11] = new JButton("'\n?");
            buttonKeysFirstRow[12] = new JButton("¿\n¡");
            buttonKeysFirstRow[13] = new JButton("Backspace");
            break;
        case 2:
            buttonKeysSecondRow[0] = new JButton("  Tab  ");
            buttonKeysSecondRow[1] = new JButton("Q");
            buttonKeysSecondRow[2] = new JButton("W");
            buttonKeysSecondRow[3] = new JButton("E");
            buttonKeysSecondRow[4] = new JButton("R");
            buttonKeysSecondRow[5] = new JButton("T");
            buttonKeysSecondRow[6] = new JButton("Y");
            buttonKeysSecondRow[7] = new JButton("U");
            buttonKeysSecondRow[8] = new JButton("I");
            buttonKeysSecondRow[9] = new JButton("O");
            buttonKeysSecondRow[10] = new JButton("P");
            buttonKeysSecondRow[11] = new JButton("´\n¨");
            buttonKeysSecondRow[12] = new JButton("+\n*");
            break;
        case 3:
            buttonKeysThirdRow[0] = new JButton("  Caps  ");
            buttonKeysThirdRow[1] = new JButton("A");
            buttonKeysThirdRow[2] = new JButton("S");
            buttonKeysThirdRow[3] = new JButton("D");
            buttonKeysThirdRow[4] = new JButton("F");
            buttonKeysThirdRow[5] = new JButton("G");
            buttonKeysThirdRow[6] = new JButton("H");
            buttonKeysThirdRow[7] = new JButton("J");
            buttonKeysThirdRow[8] = new JButton("K");
            buttonKeysThirdRow[9] = new JButton("L");
            buttonKeysThirdRow[10] = new JButton("Ñ");
            buttonKeysThirdRow[11] = new JButton("{\n[");
            buttonKeysThirdRow[12] = new JButton("}\n]");
            buttonKeysThirdRow[13] = new JButton(" Enter ");
            break;
        case 4:
            buttonKeysFourthRow[0] = new JButton("   Shift   ");
            buttonKeysFourthRow[1] = new JButton("<\n>");
            buttonKeysFourthRow[2] = new JButton("Z");
            buttonKeysFourthRow[3] = new JButton("X");
            buttonKeysFourthRow[4] = new JButton("C");
            buttonKeysFourthRow[5] = new JButton("V");
            buttonKeysFourthRow[6] = new JButton("B");
            buttonKeysFourthRow[7] = new JButton("N");
            buttonKeysFourthRow[8] = new JButton("M");
            buttonKeysFourthRow[9] = new JButton(",\n;");
            buttonKeysFourthRow[10] = new JButton(".\n:");
            buttonKeysFourthRow[11] = new JButton("^");
            break;
        case 5:
            buttonKeysFifthRow[0] = new JButton("");
            buttonKeysFifthRow[1] = new JButton("<");
            buttonKeysFifthRow[2] = new JButton("v");
            buttonKeysFifthRow[3] = new JButton(">");

            buttonKeysFifthRow[0].setMinimumSize(new Dimension(50, 10));
            break;
    } //end switch
  } //end method initializeKeys
} //end class TypingTutor

И ето моят резултат:

https://www.dropbox.com/s/dx99npirnl0v1wd/sample.png?dl=0

Опитах да използвам класа javax.swing.Box и да добавя основна кутия с Box.createVerticalBox() към центъра в JFrame BorderLayout и след това да добавя други кутии с Box.createHorizontalBox() и получавам същия резултат, всичко е наред докато не добавя JButtons след JTextArea, след това JButtons се свиват и JLabel се подравнява вдясно.


person Dazt    schedule 08.01.2015    source източник
comment
Правилно ли приемам, че имате URL адресите на изображенията си назад? Изглежда, че първото е вашият действителен резултат, а второто е желаният резултат.   -  person VGR    schedule 08.01.2015
comment
Връзките ви в грешна посока ли са? Този, който казваш, че искаш, изглежда по-лош от този, който казваш, че имаш.   -  person J Richard Snape    schedule 08.01.2015
comment
Да, съжалявам, връзките са на обратно   -  person Dazt    schedule 10.01.2015


Отговори (2)


Неинтуитивно - срещате проблем с подравняването на етикета по подразбиране. Това излиза наяве, когато комбинирате етикети с определени други компоненти в BoxLayout - вижте урока за Java на подравняване в BoxLayout

Опитайте това за вашите JLabels (обърнете внимание на двата нови реда):

instructionsLabel = new JLabel("Type some text using your keyboard. The keys you press " +
   "will be highlighted and the text will be displayed.");
noteLabel = new JLabel("Note: Clicking the buttons with your mouse will not perform any " +
    "action.");
instructionsLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
noteLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
add(instructionsLabel);
add(noteLabel);

Може да се наложи да поиграете малко, за да получите правилния размер на вашия интервал - 50 x 10 показва много малки на моя компютър...

РЕДАКТИРАНЕ:

Всъщност - интервалът, който се показва малък, също е проблем с начина, по който JButtons рисува - вижте този въпрос . В обобщение, трябва да зададете минималния и предпочитания размер, последван от максималния размер, за да сте сигурни, че проверява минималния размер и рисува правилно. И така, заменете вашия .setMinimumSize(... със следния (размери 250 x 26 работят добре на моя дисплей)

        Dimension spaceDimension = new Dimension(250, 26);
        buttonKeysFifthRow[0].setMinimumSize(spaceDimension);
        buttonKeysFifthRow[0].setPreferredSize(spaceDimension);
        buttonKeysFifthRow[0].setMaximumSize(spaceDimension);
person J Richard Snape    schedule 08.01.2015
comment
Това всъщност работи много. Сега просто трябва да задам предпочитания размер за jbuttons, благодаря ви много - person Dazt; 10.01.2015
comment
Няма проблем – ще се радвам да приемете/гласувате за отговор. - person J Richard Snape; 11.01.2015
comment
Опитах, но пише, че имам нова поне 15 репутация - person Dazt; 16.01.2015
comment
Вие сте го приели. Благодаря :) гласовете нагоре изискват 15 повторения, ще ги получите скоро, ако използвате SO няколко пъти - person J Richard Snape; 16.01.2015

Направих някои модификации на вашия код, за да го направя работещ. Ето сега изображение на графичния интерфейс на учителя по писане.

Урок по писане

Центрирах текста на инструкцията, направих областта за писане с разумен размер и поставих областта за писане в панел за превъртане. Поправих донякъде интервала.

Ето изпълнимия код.

package com.ggl.testing;

import java.awt.Dimension;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class TypingTutor extends JFrame {

    private static final long serialVersionUID = -7372491882460254385L;

    private JLabel instructionsLabel;
    private JLabel noteLabel;
    private JTextArea typingTextArea;
    private JButton[] buttonKeysFirstRow;
    private JButton[] buttonKeysSecondRow;
    private JButton[] buttonKeysThirdRow;
    private JButton[] buttonKeysFourthRow;
    private JButton[] buttonKeysFifthRow;

    // TypingTutor no-argument constructor
    public TypingTutor() {
        super("Typing Application");
        setLocationByPlatform(true);
        setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));

        JPanel instructionPanel = new JPanel();
        instructionPanel.setLayout(
                new BoxLayout(instructionPanel, BoxLayout.PAGE_AXIS));

        instructionsLabel = new JLabel(
                "Type some text using your keyboard. The keys you press "
                        + "will be highlighted and the text will be displayed.");
        instructionsLabel.setAlignmentX(JLabel.CENTER_ALIGNMENT);
        instructionPanel.add(instructionsLabel);
        noteLabel = new JLabel(
                "Note: Clicking the buttons with your mouse will not perform any "
                        + "action.");
        noteLabel.setAlignmentX(JLabel.CENTER_ALIGNMENT);
        instructionPanel.add(noteLabel);
        add(instructionPanel);

        typingTextArea = new JTextArea(10, 60);
        typingTextArea.setWrapStyleWord(true);
        JScrollPane scrollPane = new JScrollPane(typingTextArea);
        add(scrollPane);

        // each row represents each row in the keyboard
        buttonKeysFirstRow = new JButton[14];
        buttonKeysSecondRow = new JButton[13];
        buttonKeysThirdRow = new JButton[14];
        buttonKeysFourthRow = new JButton[12];
        buttonKeysFifthRow = new JButton[4];
        initializeKeys(1);
        initializeKeys(2);
        initializeKeys(3);
        initializeKeys(4);
        initializeKeys(5);
        Box[] keyboard = new Box[5];
        for (int i = 0; i < keyboard.length; i++) {
            keyboard[i] = Box.createHorizontalBox();
            switch (i) {
            case 0:
                for (int j = 0; j < buttonKeysFirstRow.length; j++) {
                    keyboard[i].add(buttonKeysFirstRow[j]);
                } // end for
                break;
            case 1:
                for (int j = 0; j < buttonKeysSecondRow.length; j++) {
                    keyboard[i].add(buttonKeysSecondRow[j]);
                } // end for
                break;
            case 2:
                for (int j = 0; j < buttonKeysThirdRow.length; j++) {
                    keyboard[i].add(buttonKeysThirdRow[j]);
                } // end for
                break;
            case 3:
                for (int j = 0; j < buttonKeysFourthRow.length; j++) {
                    keyboard[i].add(buttonKeysFourthRow[j]);
                } // end for
                break;
            case 4:
                for (int j = 0; j < buttonKeysFifthRow.length; j++) {
                    keyboard[i].add(buttonKeysFifthRow[j]);
                } // end for
                break;
            } // end switch
            add(keyboard[i]);
        } // end for
        this.pack();
        this.setVisible(true);

    } // end TypingTutor no-argument constructor

    // initializes button keys with their values
    private void initializeKeys(int keys) {
        switch (keys) {
        case 1:
            buttonKeysFirstRow[0] = new JButton("|\n°");
            buttonKeysFirstRow[1] = new JButton("1");
            buttonKeysFirstRow[2] = new JButton("2");
            buttonKeysFirstRow[3] = new JButton("3");
            buttonKeysFirstRow[4] = new JButton("4");
            buttonKeysFirstRow[5] = new JButton("5");
            buttonKeysFirstRow[6] = new JButton("6");
            buttonKeysFirstRow[7] = new JButton("7");
            buttonKeysFirstRow[8] = new JButton("8");
            buttonKeysFirstRow[9] = new JButton("9");
            buttonKeysFirstRow[10] = new JButton("0");
            buttonKeysFirstRow[11] = new JButton("'\n?");
            buttonKeysFirstRow[12] = new JButton("¿\n¡");
            buttonKeysFirstRow[13] = new JButton("Backspace");
            break;
        case 2:
            buttonKeysSecondRow[0] = new JButton("  Tab  ");
            buttonKeysSecondRow[1] = new JButton("Q");
            buttonKeysSecondRow[2] = new JButton("W");
            buttonKeysSecondRow[3] = new JButton("E");
            buttonKeysSecondRow[4] = new JButton("R");
            buttonKeysSecondRow[5] = new JButton("T");
            buttonKeysSecondRow[6] = new JButton("Y");
            buttonKeysSecondRow[7] = new JButton("U");
            buttonKeysSecondRow[8] = new JButton("I");
            buttonKeysSecondRow[9] = new JButton("O");
            buttonKeysSecondRow[10] = new JButton("P");
            buttonKeysSecondRow[11] = new JButton("´\n¨");
            buttonKeysSecondRow[12] = new JButton("+\n*");
            break;
        case 3:
            buttonKeysThirdRow[0] = new JButton("  Caps  ");
            buttonKeysThirdRow[1] = new JButton("A");
            buttonKeysThirdRow[2] = new JButton("S");
            buttonKeysThirdRow[3] = new JButton("D");
            buttonKeysThirdRow[4] = new JButton("F");
            buttonKeysThirdRow[5] = new JButton("G");
            buttonKeysThirdRow[6] = new JButton("H");
            buttonKeysThirdRow[7] = new JButton("J");
            buttonKeysThirdRow[8] = new JButton("K");
            buttonKeysThirdRow[9] = new JButton("L");
            buttonKeysThirdRow[10] = new JButton("Ñ");
            buttonKeysThirdRow[11] = new JButton("{\n[");
            buttonKeysThirdRow[12] = new JButton("}\n]");
            buttonKeysThirdRow[13] = new JButton(" Enter ");
            break;
        case 4:
            buttonKeysFourthRow[0] = new JButton("   Shift   ");
            buttonKeysFourthRow[1] = new JButton("<\n>");
            buttonKeysFourthRow[2] = new JButton("Z");
            buttonKeysFourthRow[3] = new JButton("X");
            buttonKeysFourthRow[4] = new JButton("C");
            buttonKeysFourthRow[5] = new JButton("V");
            buttonKeysFourthRow[6] = new JButton("B");
            buttonKeysFourthRow[7] = new JButton("N");
            buttonKeysFourthRow[8] = new JButton("M");
            buttonKeysFourthRow[9] = new JButton(",\n;");
            buttonKeysFourthRow[10] = new JButton(".\n:");
            buttonKeysFourthRow[11] = new JButton("^");
            break;
        case 5:
            buttonKeysFifthRow[0] = new JButton("                             ");
            buttonKeysFifthRow[1] = new JButton("<");
            buttonKeysFifthRow[2] = new JButton("v");
            buttonKeysFifthRow[3] = new JButton(">");
            break;
        } // end switch
    } // end method initializeKeys

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TypingTutor();
            }
        });
    }

} // end class TypingTutor
person Gilbert Le Blanc    schedule 08.01.2015
comment
Това не съответства на оформлението, което въпросът се опитва да постигне. - person VGR; 09.01.2015
comment
Центрирането на JLabels беше решението на моя проблем, благодаря ви много. - person Dazt; 10.01.2015