Вопрос по java, jtextfield, line, jseparator, swing – Как получить цветную линию, чтобы дифференцировать массив текстового поля в разгаре

1

Я разработал один кадр, на котором я использовал 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));
            }
        }

Ваш Ответ

1   ответ
5

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

Если вы правильно настроили свои поля, вы сможете получить составные панели /LineBorder работать

UPDATE

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

Matte Border

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;

}

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

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

Separators

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++;

}

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

UPDATED with field management

// 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;

}
Да, это нормально, учитывая, что у вас есть настройка массива в (я полагаю) столбце за порядком строк, вы можете обновить метод buildGroup, чтобы получить двумерный массив полей & amp; столбец & amp; смещение строки. Вместо того, чтобы создавать поле, вы должны извлечь его из массива. Поэтому первая группа должна начинаться с @ 0x0 & amp; заканчивается 2x2 (столбец за строкой), вторая группа должна начинаться с @ 3x0 & amp; заканчивается 5х2 и т. д.
Большое спасибо за Ваш ответ. Я использовал MatteBorder, но проблема в том, что я не должен менять названия текстового поля. Здесь вы дали общее имя всем текстовым полям. Но в моем коде я соединил каждое поле с некоторым отношением. Вместо того, чтобы использовать отдельные имена для 144 полей, я использовал jt [0] [0], jt [0] [1] .... вот так, используя циклы. Spike
Извините, я вас не получил. Пожалуйста, не возражайте, это не похоже на то, что ваше объяснение нехорошо, но мой уровень понимания низок, так как я новичок в качелях. Надеюсь, вы понимаете. Spike
Извините, я не получил ваш ответ о границе линии. Я использовал JSeparator, но он не работает. Spike
@ AnoopKumar, в принципе, идея в том, что вместо того, чтобы размещать все поля на одной панели, вы равномерно распределяете их по отдельным панелям & amp; использовать LineBorder на каждом ... Попытка усыпить ребенка, будет обновлять позже

Похожие вопросы