Не могу краски на JFrame - PullRequest
0 голосов
/ 30 мая 2018

У меня проблема с рисованием JLabel на моем JFrame.Я уже делал это в другом проекте, и он работал должным образом, но я где-то все испортил и больше не могу рисовать.Вот мой код:

Плата:

import javax.swing.*;
import java.awt.*;

public class Board extends JPanel {

public Board() {
    initBoard();
}

private void initBoard() {
    setPreferredSize(new Dimension(Frame.GAME_WIDTH, Frame.GAME_HEIGHT));
    setMinimumSize(new Dimension(Frame.GAME_WIDTH, Frame.GAME_HEIGHT));
    setMaximumSize(new Dimension(Frame.GAME_WIDTH, Frame.GAME_HEIGHT));
    setBackground(Color.GRAY);
    setDoubleBuffered(true);
  }
}

Кадр:

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.io.File;
import java.io.IOException;

public class Frame extends JFrame {

    public static final int GAME_WIDTH = 800;
    public static final int GAME_HEIGHT = 600;
    private final String title = "title here";

    private Image backgroundIMG;

    public Frame() {
        initUI();
    }

    private void initUI() {
        add(new Board());
        pack();
        setTitle(title);
        setSize(GAME_WIDTH, GAME_HEIGHT);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        setResizable(false);
        setLayout(null);


        /*
         * set background image
         */
        /*try {
            this.backgroundIMG = ImageIO.read(new File("src/to/image"));
        } catch (IOException e) {
            e.printStackTrace();
        }*/

        Border emptyBorder = BorderFactory.createEmptyBorder();

        int titleWidth = 270;
        int titleHeight = 55;
        int titleX = 24;
        int titleY = 30;
        int titleSize = 47;
        String titleFont = "Ravie";

        /*
         * Customize the startscreen
         */
        JLabel title = new JLabel("text");
        title.setBounds(0, 0, titleWidth, titleHeight);
        title.setFont(new Font(titleFont, Font.BOLD, titleSize));
        title.setForeground(new Color(251,102,8));
        title.setLocation(titleX, titleY);
        add(title);
        System.out.println("title should be printed");
    }
}

Пусковая установка:

import java.awt.*;

public class Launcher {

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            Frame main = new Frame();
            main.setVisible(true);
        });
    }
}

Когда я запускаю программу,Фрейм загружается, но не отображает JLabel.На консоли также напечатано «название должно быть напечатано».Я уже провел некоторые исследования, но не смог найти ничего, что мне помогло.Может быть, это просто банальная ошибка, и кто-то может помочь мне очень быстро.

Заранее спасибо

1 Ответ

0 голосов
/ 30 мая 2018

Отбрасывая на время все «интересные» вещи, ваша основная проблема сводится к следующему ...

add(new Board());
//... 
add(title);

Java / Swing Paint - это его компонент в порядке LIFO, так что последний компонентдобавлен первый окрашенный компонент.

Вероятно, наиболее логичным решением является добавление title к Board, но вы можете сначала решить несколько других проблем ...

  • Избегайте расширения от контейнеров верхнего уровня, таких как JFrame.Множество причин, но в основном вы не добавляете новые функциональные возможности в класс, и это блокирует вас в одном случае использования, которым можно лучше управлять с помощью других средств / компонентов
  • Избегайте setPreferred/Minimum/MaximumSize.Это больше проблем, чем они того стоят.Вместо этого, при необходимости, переопределение getPreferredSize
  • setDoubleBuffered(true); не имеет смысла, так как компоненты Swing по умолчанию имеют двойную буферизацию
  • Избегайте null макетов, если серьезно, это причина номер один длябольшинство вопросов, о которых люди пишут на SO.API управления компоновкой существует по определенной причине, научитесь использовать его.

Если мы примем все это во внимание, вы можете оказаться в чем-то более ...

Possible solution

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Image;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    private final String title = "title here";

    public Test() {
        EventQueue.invokeLater(() -> {
            JFrame main = new JFrame(title);
            main.add(new MainPane());
            main.pack();
            main.setLocationRelativeTo(null);
            main.setVisible(true);
        });
    }

    public static final int GAME_WIDTH = 800;
    public static final int GAME_HEIGHT = 600;

    public static class MainPane extends JPanel {

        private Image backgroundIMG;

        public MainPane() {
            setLayout(new BorderLayout());

            setBackground(Color.GRAY);

            add(new Board());

            String titleFont = "Ravie";
            int titleSize = 47;
            JLabel title = new JLabel("text");
            title.setHorizontalAlignment(JLabel.CENTER);
            title.setFont(new Font(titleFont, Font.BOLD, titleSize));
            title.setForeground(new Color(251, 102, 8));
            add(title, BorderLayout.NORTH);
        }
    }

    public static class Board extends JPanel {

        public Board() {
            initBoard();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(GAME_WIDTH, GAME_HEIGHT);
        }

        private void initBoard() {
            setBackground(Color.GRAY);
        }
    }

}
...