Java Swing прозрачная проблема JPanels - PullRequest
4 голосов
/ 19 апреля 2010

У меня есть JLayeredPane, куда я добавляю 3 JPanels.

Я делаю JPanels прозрачными (не задан фон и установлено значениеOpoque (false)). Я рисую линии на JPanels и видима только линия на последнем добавленном JPanel. Линии других JPanel не видны через этот верхний JPanel (даже если я добавил разные zIndexes при их добавлении).

Кто-нибудь знает решение для этого? Почему они не прозрачны?

Я создал небольшую тестовую программу (3 класса). (TestJPanel и TestJPanel1 рисуют линию, но в другой позиции, но я вижу только линию последнего добавленного JPanel. Я не вижу 2 линии, потому что она не прозрачна :()

Main.Java

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;

public class Main extends JFrame {
  public Main() {
    setSize(400, 350);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    JLayeredPane lp = getLayeredPane();
    lp.setLayout(new BorderLayout());
    TestJPanel top = new TestJPanel();
    top.setOpaque(false);
    TestJPanel middle = new TestJPanel();
    middle.setOpaque(false);
    TestJPanel1 bottom = new TestJPanel1();
    bottom.setOpaque(false);

    lp.add(middle, BorderLayout.CENTER, new Integer(4));
    lp.add(top, BorderLayout.CENTER, new Integer(3));
    lp.add(bottom, BorderLayout.CENTER, new Integer(2));
    // the last one I have added (bottom) is visible and can't see the others through it

    setVisible(true);
  }

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

  }
}

TestJPanel.java

import java.awt.Graphics;


public class TestJPanel extends javax.swing.JPanel {

    /** Creates new form TestJPanel */
    public TestJPanel() {
        initComponents();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawLine(25, 0, 25, 50);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );
    }// </editor-fold>


    // Variables declaration - do not modify
    // End of variables declaration

}

TestJPanel1.java

import java.awt.Graphics;


public class TestJPanel1 extends javax.swing.JPanel {

    /** Creates new form TestJPanel */
    public TestJPanel1() {
        initComponents();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawLine(50, 0, 50, 50);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );
    }// </editor-fold>


    // Variables declaration - do not modify
    // End of variables declaration

}

Я действительно надеюсь, что кто-нибудь сможет мне помочь a.s.a.p. с этой проблемой.

Ответы [ 2 ]

4 голосов
/ 19 апреля 2010

Удалить строку

lp.setLayout(new BorderLayout());

и замените ваши вызовы add () на

lp.add(component, layer);

Вы используете LayeredPane неправильно - с LayeredPane вы (как правило) не хотите устанавливать макет. Я считаю (но должен проверить), что причина, по которой вы видите только одну строку, в том, что с BorderLayout, если вы добавляете несколько компонентов в один и тот же регион (например, BorderLayout.CENTER), позиционируется только последний добавленный вами ; остальные эффективно удаляются из макета.

Подробнее см. учебник Swing на многоуровневых панелях

1 голос
/ 19 апреля 2010

Вы добавляете свои панели в тот же регион BorderLayout.

...