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

java swing line jtextfield jseparator

458 просмотра

1 ответ

62 Репутация автора

Я разработал один кадр, на котором я использовал GridBagLayout для упорядочивания текстовых полей 12X12. т.е. всего 144 текстовых поля на фрейме. Теперь я хочу разграничить эти текстовые поля цветной линией после каждых 3 столбцов и трех строк, как показано на следующей диаграмме. Я пытался разными способами, но я не мог найти решение. Пожалуйста, предложите. Ниже приведена некоторая часть моего кода. Заранее спасибо.

1 2 3 | 4 5 6 | 7 8 9 | 10 11 12
      |       |       |
1 2 3 | 4 5 6 | 7 8 9 | 10 11 12 
      |       |       |
1 2 3 | 4 5 6 | 7 8 9 | 10 11 12
-------------------------------    
1 2 3 | 4 5 6 | 7 8 9 | 10 11 12
      |       |       |
1 2 3 | 4 5 6 | 7 8 9 | 10 11 12
      |       |       |
1 2 3 | 4 5 6 | 7 8 9 | 10 11 12
--------------------------------    |
1 2 3 | 4 5 6................
. .
. .
.

Пожалуйста, рассмотрите каждое число как одно текстовое поле на диаграмме.

JTextField jt[][]=new JTextField[12][12];


for(int i=0;i<jt.length;i++)
        {
            for(int j=0;j<jt.length;j++)
            {

                jt[i][j] = new JTextField(1);


                constraints.gridx=j;
                consraints.gridy=i;
                gridbag.setConstraints(jt[i][j],cons);
                c.add(jt[i][j]);
                                jt[i][j].setHorizontalAlignment(JTextField.CENTER);
                jt[i][j].setFont(new Font("TimesNewRoman",Font.BOLD,14));
                jt[i][j].setDocument(new JTextFieldLimit(2));
            }
        }
Автор: Spike Источник Размещён: 13.08.2012 07:44

Ответы (1)


6 плюса

307857 Репутация автора

Решение

Вы можете использовать JSeparator или разбить каждую группу полей 3х3 на свои отдельные панели и использовать LineBorder .

Пока вы правильно настроили свои поля, вы сможете заставить составные панели LineBorderработать

ОБНОВИТЬ

Извините, это должно было быть MatteBorder: P

Матовый бордюр

GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = 0;
gbc.gridy = 0;

for (int row = 0; row < 4; row++) {

    gbc.gridx = 0;

    add(buildGroup(0, 0, 1, 1), gbc);
    gbc.gridx++;
    add(buildGroup(0, 0, 1, 1), gbc);
    gbc.gridx++;
    add(buildGroup(0, 0, 1, 1), gbc);
    gbc.gridx++;
    add(buildGroup(0, 0, 1, 0), gbc);
    gbc.gridy++;

}

public JPanel buildGroup(int top, int left, int bottom, int right) {

    JPanel panel = new JPanel(new GridBagLayout());
    panel.setBorder(new MatteBorder(top, left, bottom, right, Color.RED));
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.insets = new Insets(2, 2, 2, 2);
    gbc.fill = GridBagConstraints.HORIZONTAL;
    for (int row = 0; row < 3; row++) {
        for (int col = 0; col < 3; col++) {

            JTextField field = new JTextField(8);
            gbc.gridx = col;
            gbc.gridy = row;

            panel.add(field, gbc);

        }
    }

    return panel;

}

Теперь, очевидно, вам нужно выяснить, как вы будете заполнять свои поля, но в основном я просто передам поля, которые вы хотите использовать (например, 2D-массив).

Или с разделителями: P

Сепараторы

for (int row = 0; row < 9; row++) {

    gbc.gridwidth = 1;
    gbc.weightx = 0;

    int verSplit = 0;

    for (int col = 0; col < 12; col++) {

        gbc.gridx++;

        add(new JTextField(8), gbc);

        verSplit++;
        if (verSplit == 3) {

            verSplit = 0;

            gbc.gridx++;

            if (horSplit % 3 == 0) {

            gbc.gridheight = 3;
            gbc.fill = GridBagConstraints.VERTICAL;
            add(new JSeparator(JSeparator.VERTICAL), gbc);

            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.gridheight = 1;

            }

        }

    }

    horSplit++;

    gbc.gridx = 0;

    if (horSplit == 3) {

        horSplit = 0;
        gbc.gridy++;
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        gbc.weightx = 1;
        add(new JSeparator(JSeparator.HORIZONTAL), gbc);

    }

    gbc.gridy++;

}

Или вариации на одну и ту же тему

ОБНОВЛЕНО с полевым управлением

// Build the array of fields, I used a col by row matrix
JTextField fields[][] = new JTextField[12][12];
for (int col = 0; col < 12; col++) {

    for (int row = 0; row < 12; row++) {

        fields[col][row] = new JTextField(col + "x" + row, 8);

    }

}

// Build the groups...
for (int row = 0; row < 12; row++) {

    gbc.gridx = 0;

    int col = 0;

    add(buildGroup(fields, col, row, 0, 0, 1, 1), gbc);

    col += 3;
    gbc.gridx++;
    add(buildGroup(fields, col, row, 0, 0, 1, 1), gbc);

    col += 3;
    gbc.gridx++;
    add(buildGroup(fields, col, row, 0, 0, 1, 1), gbc);

    col += 3;
    gbc.gridx++;
    add(buildGroup(fields, col, row, 0, 0, 1, 0), gbc);

    gbc.gridy++;
    row += 2; // This is important, don't miss this ;)

}

public JPanel buildGroup(JTextField[][] fields, int startCol, int startRow, int top, int left, int bottom, int right) {

    JPanel panel = new JPanel(new GridBagLayout());
    panel.setBorder(new MatteBorder(top, left, bottom, right, Color.RED));
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.insets = new Insets(2, 2, 2, 2);
    gbc.fill = GridBagConstraints.HORIZONTAL;
    for (int row = 0; row < 3; row++) {
        for (int col = 0; col < 3; col++) {

            // Get the field to use for this cell 
            JTextField field = fields[col + startCol][row + startRow];
            gbc.gridx = col;
            gbc.gridy = row;

            panel.add(field, gbc);

        }
    }

    return panel;

}
Автор: MadProgrammer Размещён: 13.08.2012 07:47
Вопросы из категории :
32x32