Вызов JFrame.setGlassPane (Component) более одного раза - PullRequest
0 голосов
/ 15 сентября 2009

Есть ли хитрость для вызова JFrame.setGlassPane(Component) более одного раза? В приведенном ниже коде я сначала вызываю его, чтобы создать красную рамку на стеклянной панели. Это отлично работает. Затем, в обработчике щелчка мыши, я снова вызываю его, чтобы создать синее поле на новой стеклянной панели. Это не работает Оригинальная панель красного стекла исчезает, но панель синего стекла не появляется. Что я тут не так делаю?

public class GlassPaneProblem extends Component {

    private BufferedImage img;
    private JFrame f;

    public void paint(Graphics g) {
        g.drawImage(img, 0, 0, null);
    }

    public GlassPaneProblem() {
        try {
            img = ImageIO.read(new File("images/AppleCorps.JPG"));
        } catch (IOException e) {
        }
        this.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                BlueGlassPane blueGlassPane = new BlueGlassPane();
                setTheGlassPane(blueGlassPane);
            }
        });
    }

    public Dimension getPreferredSize() {
        if (img == null) {
            return new Dimension(100, 100);
        } else {
            return new Dimension(img.getWidth(null), img.getHeight(null));
        }
    }

    public void run() {
        f = new JFrame("Glass Pane Problem");

        f.add(this);
        f.pack();
        RedGlassPane redGlassPane = new RedGlassPane();
        setTheGlassPane(redGlassPane);
        f.setVisible(true);
    }

    void setTheGlassPane(JComponent glassPane) {
        f.setGlassPane(glassPane);
        f.getGlassPane().setVisible(true);
    }

    public static void main(String[] args) {
        GlassPaneProblem glassPaneProblem = new GlassPaneProblem();
        glassPaneProblem.run();
    }
}

class RedGlassPane extends JComponent {
    protected void paintComponent(Graphics g) {
        Rectangle clip = g.getClipBounds();
        g.setColor(Color.RED);
        g.fillRect(clip.x + clip.width / 3, clip.y + clip.height / 3,
            clip.width / 3, clip.height / 3);
    }
}

class BlueGlassPane extends JComponent {
    protected void paintComponent(Graphics g) {
        Rectangle clip = g.getClipBounds();
        g.setColor(Color.BLUE);
        g.fillRect(clip.x + clip.width / 3, clip.y + clip.height / 3,
            clip.width / 3, clip.height / 3);
    }
}

Вызов repaint() как это не решает проблему:

void setTheGlassPane(JComponent glassPane) {
    f.setGlassPane(glassPane);
    f.getGlassPane().setVisible(true);
    f.repaint();
}

1 Ответ

1 голос
/ 16 сентября 2009

В setTheGlassPane(), добавьте это как первую строку:

f.getGlassPane().setVisible(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...