#java #swing #graphics #jlayeredpane
#java #swing #графика #jlayeredpane
Вопрос:
Я пытаюсь постепенно создавать изображение на основе пользовательских данных. То, что я пытаюсь сделать, это создать кучу графики и добавить их в виде слоев, однако у меня возникают некоторые проблемы, поскольку они не отображаются. Вот код, который я использую:
public class ClassA
{
protected final static int dimesionsY = 1000;
private static int dimesionsX;
private static JFrame window;
private static JLayeredPane layeredPane;
public void init()
{
window = new JFrame("Foo");
dimesionsX = // some user input
window.setPreferredSize(new Dimension(dimesionsX, dimesionsY));
window.setLayout(new BorderLayout());
layeredPane = new JLayeredPane();
layeredPane.setBounds(0, 0, dimesionsX, dimesionsY);
window.add(layeredPane, BorderLayout.CENTER);
ClassB myGraphic = new ClassB();
myGraphic.drawGraphic();
layeredPane.add(myGrpahic, new Integer(0), 0);
window.pack();
window.setVisible(true);
}
}
public class ClassB extends JPanel
{
public void drawGraphic()
{
repaint();
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(10, 10, 100, 100);
}
}
Однако моя графика, похоже, не отображается, и я не понимаю, почему. Я также попытался добавить ее в JPanel
первую, добавив это JPanel
к JLayeredPane
тому, что, однако, тоже не сработало.
Пожалуйста, кто-нибудь может мне помочь?
Ответ №1:
Если вы добавляете компонент в JLayeredPane, это похоже на добавление его в нулевой макет с помощью контейнера: вы должны полностью указать размер и положение компонента.
например,
import java.awt.*;
import javax.swing.*;
public class ClassA {
protected final static int dimesionsY = 800;
protected final static int dimesionsX = 1000; //!!
private static JFrame window;
private static JLayeredPane layeredPane;
public void init() {
window = new JFrame("Foo");
// !! dimesionsX = // some user input
//!! window.setPreferredSize(new Dimension(dimesionsX, dimesionsY));
window.setLayout(new BorderLayout());
layeredPane = new JLayeredPane();
//!! layeredPane.setBounds(0, 0, dimesionsX, dimesionsY);
layeredPane.setPreferredSize(new Dimension(dimesionsX, dimesionsY));
window.add(layeredPane, BorderLayout.CENTER);
ClassB myGraphic = new ClassB();
myGraphic.drawGraphic();
myGraphic.setSize(layeredPane.getPreferredSize());
myGraphic.setLocation(0, 0);
//!! layeredPane.add(myGraphic, new Integer(0), 0);
layeredPane.add(myGraphic, JLayeredPane.DEFAULT_LAYER);
window.pack();
window.setVisible(true);
}
public static void main(String[] args) {
new ClassA().init();
}
}
class ClassB extends JPanel {
public void drawGraphic() {
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(10, 10, 100, 100);
}
}
Комментарии:
1. Кроме того, если вы накладываете JPanels друг на друга, надеюсь, вы позаботились о том, чтобы значение opaque было равно false . Другое решение вашей проблемы включает наложение буферных изображений друг на друга.
2. Спасибо за вашу помощь в этом. Я заметил, что вы использовали
JLayeredPane.DEFAULT_LAYER
при добавлении графики. Мне просто интересно, что лучше всего использовать в случае, если я хочу добавить дополнительную графику?3. Я бы использовал любую логику, чтобы работать наилучшим образом. Если у меня есть что-то, что, как я знаю, будет внизу, я помещу это в слой по умолчанию.
4. Хорошо, это имеет смысл. Как бы мне добавить слой, чтобы он был поверх всего?
5. @JonW09: он просто должен иметь самую высокую целочисленную (…) константу при добавлении ее в JLayeredPane. Также проверьте API JLayeredPane для констант по умолчанию, которые использует Swing и которые вы тоже можете использовать.
Ответ №2:
См. раздел «Размещение компонентов на многоуровневой панели» из руководств по Java.
Кроме того, иногда вам нужно установить предпочтительный размер:
layeredPane.setPreferredSize(new Dimension(width, height));