Мой код JLabel и GUI в методе paintcomponent не рисуются одновременно

1

Когда я пытаюсь нарисовать JLabel или мой графический интерфейс, все, что я добавляю в свой последний JFrame, нарисовано, а остальное просто не рисуется и не нарисовано. Я был бы признателен, если бы вы могли помочь мне найти решение для рисования JLabel в определенном месте вместе с моим графическим интерфейсом. Я слышал о макете и о том, как это может мне помочь, но было много разных людей, говорящих по этому поводу. Вот мой код.

import java.util.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.Timer;
import javax.swing.JPanel;
import javax.swing.JFrame;
import static java.lang.System.*;
import java.awt.event.*;
import java.awt.Graphics.*;


public class Main extends JPanel
{
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    double w = screenSize.getWidth();
    double h = screenSize.getHeight();
    static JFrame f = new JFrame("Tic-Tac-Toe");
    static JPanel p = new JPanel();
    int width = (int)w;
    int height = (int)h;
    int width1a = width/2 - 300;
    int width2a = width/2 - 100;
    int width3a = width/2 + 100; 
    int width4a = width/2 + 300;
    int height1from = (int)height - 100;
    int height1to = (int)height - (int)(height/1.05);
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        JLabel l = new JLabel("Hello World !");
        f.add(l);
        Graphics2D g2 = (Graphics2D) g;
        g2.setStroke(new BasicStroke(10));
        g.setColor(Color.black);
        g2.drawLine(width1a, height1from, width1a, height1to);
        g2.drawLine(width2a, height1from, width2a, height1to);
        g2.drawLine(width3a, height1from, width3a, height1to);
        g2.drawLine(width4a, height1from, width4a, height1to);
    }
    public static void main(String[] args)
    {
        Main m = new Main();
        f.setSize(400,300);
        f.setExtendedState(Frame.MAXIMIZED_BOTH); 
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);      
        JLabel l = new JLabel("Hello World !");               
        f.add(p);
        f.add(m);
    }
}

Скажите, пожалуйста, если я был неясен или что-то еще. Я просто хочу, чтобы JLabel и графические графические изображения отображались на JFrame. Не стесняйтесь предлагать все, что я должен сделать, и поблагодарить вас за ваше время!

Теги:
swing
jlabel
paintcomponent

1 ответ

3
Лучший ответ

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

См. " Живопись в AWT" и "Swing" и " Выполнение пользовательской живописи" для получения более подробной информации о том, как живопись работает в Swing...

Вы добавляете три компонента в одну и ту же позицию в BorderLayout, обычно обычно отображается только последний компонент, так как он управляется BorderLayout

См. Раздел " Выравнивание компонентов в контейнере" и " Использование BorderLayout" для получения более подробной информации.

Вы также должны убедиться, что вы создаете свой пользовательский интерфейс из контекста Диспетчерского потока событий, см. " Начальные потоки" для получения более подробной информации

Живопись также является контекстуальной для окрашенного компонента, то есть 0x0 является верхним левым углом компонента, любая картина, выполненная за пределами визуального диапазона компонента, просто теряется.

Вы также должны избегать использования static, как правило, это хороший признак того, что у вас есть проблемы с вашим дизайном, он становится особенно беспорядочным в пользовательском интерфейсе. Если вы действительно хотите услышать, как я слышу о static, ознакомьтесь с этим ответом

Изображение 174551

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JPanel blue = new JPanel();
                blue.setBackground(Color.BLUE);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JLabel("Hello world"), BorderLayout.NORTH);
                frame.add(new TestPane());
                frame.add(blue, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            add(new JLabel("Hello World"));
        }

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            // This could actually be achieved using a EmptyBorder and a LineBorder
            // but this demonstrates the point...
            g2d.setColor(Color.RED);
            g2d.drawRect(10, 10, getWidth() - 20, getHeight() - 20);
            g2d.dispose();
        }

    }

}
  • 0
    Нужно ли использовать оператор try и catch, чтобы просто нарисовать и добавить JLabel?
  • 0
    У меня личная, глубоко укоренившаяся ненависть к внешнему виду и ощущениям по умолчанию. Я предпочитаю внешний вид системы, это мое личное предпочтение, если вы не хотите настраивать внешний вид, вам это не нужно
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню