Когда я пытаюсь нарисовать 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. Не стесняйтесь предлагать все, что я должен сделать, и поблагодарить вас за ваше время!
Вы никогда не добавляете компоненты в компонент из метода рисования. Вы никогда не должны изменять состояние компонента каким-либо образом из-за метода рисования, живопись - для рисования, ничего больше.
См. " Живопись в AWT" и "Swing" и " Выполнение пользовательской живописи" для получения более подробной информации о том, как живопись работает в Swing...
Вы добавляете три компонента в одну и ту же позицию в BorderLayout
, обычно обычно отображается только последний компонент, так как он управляется BorderLayout
См. Раздел " Выравнивание компонентов в контейнере" и " Использование BorderLayout" для получения более подробной информации.
Вы также должны убедиться, что вы создаете свой пользовательский интерфейс из контекста Диспетчерского потока событий, см. " Начальные потоки" для получения более подробной информации
Живопись также является контекстуальной для окрашенного компонента, то есть 0x0
является верхним левым углом компонента, любая картина, выполненная за пределами визуального диапазона компонента, просто теряется.
Вы также должны избегать использования static
, как правило, это хороший признак того, что у вас есть проблемы с вашим дизайном, он становится особенно беспорядочным в пользовательском интерфейсе. Если вы действительно хотите услышать, как я слышу о static
, ознакомьтесь с этим ответом
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();
}
}
}