2

SSCCEと回避策で編集

JDialog の場所をプログラムで変更したいと考えています。

public class SSCCE {
  public static void main(String[] pArgs) {
    JDialog dialog = new JDialog();
    dialog.setSize(300, 300);
    dialog.setLocation(10, 10);
    dialog.setVisible(true);
  }
}

ただし、これは機能しません。新しいダイアログは常に画面の中央に配置されます。ダイアログを非装飾に設定すると、L&F (Windows 7 64bit、jdk 1.6_30) と何か関係があると思われます。

public class SSCCEWorksButUndecorated {
  public static void main(String[] pArgs) {
    JDialog dialog = new JDialog();
    dialog.setSize(300, 300);
    dialog.setLocation(10, 10);
    dialog.setUndecorated(true);
    dialog.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
    dialog.setVisible(true);
  }
}

場所は私が指定した場所です。

しかし、装飾されたダイアログが必要です。他の誰かが以前にこの問題を見たことがありますか、それとも何か不足していますか?

モーダル ダイアログの setVisible()の設定場所による回避策

public class SSCCEWorkaroundForModalDialogs {
  public static void main(String[] pArgs) {
    final JDialog dialog = new JDialog();
    dialog.setSize(300, 300);
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        dialog.setLocation(10, 10);
      }
     });        
     dialog.setVisible(true);
  }
}
4

2 に答える 2

1

move メソッドのドキュメントには次のように書かれています。

このメソッドは、レイアウト関連の情報を変更するため、コンポーネント階層を無効にします。

このメソッドは、ジオメトリ関連のデータを変更します。したがって、ネイティブ ウィンドウ システムは、そのような要求を無視するか、または要求されたデータを変更して、デスクトップ設定に厳密に対応する方法で Window オブジェクトが配置およびサイズ設定されるようにすることができます。

revalidaite()ダイアログを再び表示するように設定する前に、 を呼び出すことができると思います。

于 2012-06-28T11:14:15.807 に答える
0

私は私のやり方でやった -

package com.whodesire.element;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.KeyStroke;

public class MessageEdge {
    private JDialog messageEdge = null;
    private JDialog tempMessage = null;
    private Point elmLoc = null;
    private String[] option;
    private JButton btnOK;
    private JLayeredPane lp = null;
    private int top = 70;

    MessageEdge(JFrame owner){
        owner.setAlwaysOnTop(false);
    }

    public void ShowMessage(final String msg){
        ShowMessage(msg, "OK");
    }

    public void ShowMessage(final String msg, final String... option){
        this.option = option;
        init();
    }

    protected void setRootPaneStroking(JRootPane rootPane){
        rootPane.setWindowDecorationStyle(JRootPane.NONE);
        KeyStroke stroke = KeyStroke.getKeyStroke("ESCAPE");
        Action action = new AbstractAction() {
            private static final long serialVersionUID = 1L;
            public void actionPerformed(ActionEvent e) {
                disposeMessage();
            }
        };

        InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        inputMap.put(stroke, "ESCAPE");
        rootPane.getActionMap().put("ESCAPE", action);
    };

    private void init(){
        top = 70;

        tempMessage = new JDialog(){
            private static final long serialVersionUID = 1L;
                {
                    setUndecorated(true);
                    setType(Type.UTILITY);
                    setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                    setBackground(new Color(0, 0, 0, 0));

                    elmLoc = Elementos.getElementosLocationPoint();
                    setSize(460, 57);
                    setLayout(new GridLayout(1, 1));
                    if(lp == null) 
                        lp = getModelJLayeredPane();
                    add(lp);

                    setLocation(elmLoc.x-10, elmLoc.y+top);
                    setAlwaysOnTop(true);

                    validate();
                    setVisible(true);
                }
        };

        new Thread(new Runnable(){
            public void run(){
                try{
                    OneMethod.playSound("catchyMessage");
                    whileLoop:
                    while(true){
                        //System.out.println("top value is : " + top + ", is top value bigger than -47 : " + (top > -47));
                        if(top > -47){
                            top -= 7;
                            tempMessage.setLocation(elmLoc.x-10, elmLoc.y+top);
                        }else{
                            top = -47;
                            initMessageEdge();
                            break whileLoop;
                        }
                        Thread.sleep(4);
                    }
                }catch(InterruptedException ie){
                    ie.printStackTrace();
                }
            }
        }).start();
    }

    private void initMessageEdge(){
        tempMessage.setVisible(false);
        tempMessage.remove(lp);
        tempMessage.dispose();

        //Elementos is my JFrame
        messageEdge = new JDialog(Elementos.getFrame(), true){
            private static final long serialVersionUID = 1L;
                {
                    setUndecorated(true);
                    setType(Type.UTILITY);
                    setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

                    setRootPaneStroking(getRootPane());
                    setBackground(new Color(0, 0, 0, 0));

                    requestFocusInWindow();

                    elmLoc = Elementos.getElementosLocationPoint();
                    setSize(460, 57);
                    setLayout(new GridLayout(1, 1));
                    if(lp == null) 
                        lp = getModelJLayeredPane();
                    add(lp);
                    setLocation(elmLoc.x-10, elmLoc.y+top);
                    setAlwaysOnTop(true);   
                    validate();
                }
        };
        messageEdge.setVisible(true);
        messageEdge.requestFocus();
    }

    private JLayeredPane getModelJLayeredPane(){
        JLayeredPane layer = new JLayeredPane();
        layer.setBounds(0, 0, 460, 57);
        layer.setLayout(null);

        JPanel panel = new JPanel(){
            private static final long serialVersionUID = 1L;
            public void paintComponent(Graphics gr){
                super.paintComponent(gr);
                Graphics2D g = (Graphics2D) gr;
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN, 0.01f));
                g.setColor(new Color(255, 196, 51));
                g.fillRect(0, 0, 460, 57);

                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.75f));
                g.setColor(new Color(255, 196, 51));
                g.fillRect(0, 0, 460, 47);

                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
                g.setColor(new Color(244, 171, 50));
                int[] xxPoly = {0, 10,  10};
                int[] yyPoly = {47, 47, 57}; 
                Polygon pplg = new Polygon(xxPoly, yyPoly, xxPoly.length);
                g.fillPolygon(pplg);
            }
        };
        panel.setSize(450, 57);
        panel.setOpaque(true);
        panel.setLayout(null);
        layer.add(panel);

        btnOK = new JButton(){
            private static final long serialVersionUID = 1L;
            @Override
            protected void paintComponent(Graphics gr) {
                final Graphics2D g = (Graphics2D) gr.create();
                g.setPaint(new GradientPaint(new Point(0, 0), Color.WHITE, 
                        new Point(0, getHeight()), new Color(255, 196, 51)));
                g.fillRect(0, 0, getWidth(), getHeight());
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
                g.setColor(Color.BLACK);
                g.setFont(new Font(OneMethod.getSegoeUIBoldFont().getFamily(), Font.BOLD, 11));
                g.drawString(option[0], 8, 17);
                g.dispose();
                super.paintComponent(g);
            }
        };
        btnOK.setFocusPainted(false);
        btnOK.setBorder(BorderFactory.createLineBorder(new Color(244, 171, 50)));
        btnOK.setBounds(460-30, (int)((47/2)-(25/2)), 30, 25);
        layer.add(btnOK);
        btnOK.addMouseListener(new MouseAdapter(){
            @Override
            public void mousePressed(MouseEvent evt){
                btnOK.setBorder(BorderFactory.createEmptyBorder());
                btnOK.setBorder(BorderFactory.createLoweredBevelBorder());
            }
            @Override
            public void mouseReleased(MouseEvent evt){
                btnOK.setBorder(BorderFactory.createLineBorder(new Color(244, 171, 50)));
                disposeMessage();
                Elementos.getFrame().setAlwaysOnTop(true);
            }
        });
        layer.moveToFront(btnOK);

        return layer;
    }


    private void disposeMessage(){
        messageEdge.setModal(false);
        messageEdge.setVisible(false);
        messageEdge.dispose();
    }
}

それがあなたや他の人に役立つことを願っています、乾杯...

于 2016-04-02T19:10:06.253 に答える