Не показывается JLabel

221
17 октября 2017, 01:03

Решил сделать шахматную доску с цифрами и латинскими буквами. Сделал доску, но лэйбл с цифрами не показываются несмотря на то, что я создал его, а также прописал setText и setVisible. Укажите на мою ошибку.

package chess123;    
import javax.swing.*;
import java.awt.Color;
public class board{
    public static void main (String [] args) {
        for (int j = 1; j<=9; j++) {
        if (j!=9) {
        for (int i = 1; i<=8; i++) {
            JFrame nf = new JFrame();
            nf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            nf.setBounds(i*100, j*100, 100, 100);
            nf.setUndecorated(true);
            nf.setVisible(true);
            if(i % 2 == 0 & j % 2 != 0) {
                nf.getContentPane().setBackground(Color.BLACK);
            }
            else if(i % 2 != 0 & j % 2 == 0) {
                nf.getContentPane().setBackground(Color.BLACK);
            }
            else if (i % 2 == 0 & j % 2 == 0) {
                nf.getContentPane().setBackground(Color.WHITE);
            }
            else if (i % 2 != 0 & j % 2 != 0) {
                nf.getContentPane().setBackground(Color.WHITE);
            }
            if (j == 9) {
                for (int k = 1; k<=8; k++) {
                String l = String.valueOf(k);
                JLabel count = new JLabel();
                count.setText(l);
                count.setVisible(true);
                }       
            }
        }
    }
}
}
}

P.S Я знаю что цифры должны быть сбоку, но хочется сначала понять структуру JLabel.

Answer 1

Добрый день, вам нужно поместить JLabel на JPanel и не нужно ему указывать setVisible(true), это будет выглядеть примерно так в вашем коде:

JLabel count = new JLabel();
count.setText(l);
count.setBounds(x, y, width, height); // задаете координаты по Х, Y, ширину, высоту, либо можно использовать Layout
nf.getContentPane().add(count);

Но я бы сделал немного по другому, создал бы свою панель куда бы выводил разметку шахматной доски ну и соответственно JLabel, хотя большой роли это не сыграет, но все же:

JPanel contentPanel = new JPanel();
nf.setContentPanel(contentPanel);
... // Вывод на нее шахматной доски
JLabel count = new JLabel();
count.setText(l);
count.setBounds(x, y, width, height); // задаете координаты по Х, Y, ширину, высоту, либо можно использовать Layout
contentPanel.add(count);

Надеюсь, что мой ответ оказался вам полезным, удачи в изучении Swing!

Answer 2
  1. Вы инициализируете JFrame внутри цикла. То есть каждый раз создаете новую форму и пытаетесь ей задать фон (форме, а не метке). Перенесите код инициализации фрейма за пределы цикла. Потому что форма только одна.
  2. Вместо смены цвета фрейма nf.getContentPane().setBackground(...); вам нужно каждый раз создавать новый компонент для клеточки и именно ему задавать цвет.
  3. Создаваемые метки JLabel никуда не добавляются. Вам нужно сразу после создания куда-либо добавлять вашу метку. Например, на панель, которая в свою очередь должна быть на фрейме. Попробуйте использовать панель, имеющую компоновку GridLayout.
  4. Условие j == 9 в последнем вложенном цикле никогда не выполнится. Потому что он вложен в ветвление с условием j != 9.
READ ALSO
Как запретить выключение экрана?

Как запретить выключение экрана?

Если запустить приложение, то после определенного времени (это время устанавливается в настройках), экран выключается, кроме видео плеераКак...

274
Парсить данные в таблицу

Парсить данные в таблицу

Как вставить данные этого сайта в таблицу? Вообще не могу понять как их классифицировать на город и странуhttps://raw

164
Двойная буферизация VBO

Двойная буферизация VBO

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

177
Пункты меню не реагируют на нажатие

Пункты меню не реагируют на нажатие

Пункты меню, вынесенные в ActionBar работают, а те, что можно увидеть лишь при раскрытии меню не реагируют на нажатиеЕсли поменять значения в атрибутах...

166